home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy001 / graph / graph20.arj / HELP / GHELP.DAT next >
Encoding:
Text File  |  1996-09-03  |  88.1 KB  |  1,876 lines

  1. ææææ GRAPH Interactive Help ææææ
  2. %%102
  3.  
  4.        FILOSOFIA DE GRAPH
  5.  
  6.     La filosofia que adopta GRAPH és una de les més sencilles que es podría
  7.   tenir. GRAPH funciona per handles, es a dir, cuan tu crides a alguna fun-
  8.   ció, el sistema et tornarà un valor amb el que podrás referirte després a
  9.   una pantalla virtual, una paleta, etc.
  10.     Per exemple, des de l'ensamblador podriem escriure:
  11.  
  12.         CALL    CreaVirtual
  13.         MOV     [HandlePV], AL
  14.  
  15.   i després referirte a aquesta pantalla virtual amb aquest valor que hem
  16.   col·locat en la variable "HandlePV":
  17.  
  18.         MOV     AL, [HandlePV]
  19.         MOV     AH, 0
  20.         CALL    CopiaPantalla
  21.  
  22.   Així de senzill i així de potent. En altrés llenguatges com en C podriem
  23.   fer el següent:
  24.  
  25.         byte handle1;
  26.         handle1=CreaVirtual();
  27.         CopiaPantalla(handle1, 0);
  28.  
  29.     Amb aquest sistema podrem olvidar-nos de les biblioteques gràfiques que
  30.   ens tornen segments i offsets que poden fer que ens marejem en projectes
  31.   mitjans o llargs.
  32.     Altre punt important a tenir en compte al treballar amb GRAPH són les
  33.   funcions del tipus "fast" que ens permeten escollir entre una funció un
  34.   poc més ràpida o un altra amb més control d'errors. Aquestes funcions es
  35.   criden col·locant davant una `f∩. Per exemple, la funció "PonPixel" és
  36.   fast i podrem, doncs, cridar-la d'aquestes dos maneres:
  37.  
  38.         PonPixel(x, y, 16, 0);
  39.         fPonPixel(x, y, 16, 0);
  40.  
  41.   la primera ens donarà més informació d'errors mentre la segona serà un poc
  42.   més ràpida, però amb menys errors. Tambè es diferencien en que la primera,
  43.   en les funcions en que siga possible, s'aplicarà les tècniques de clipping
  44.   o retall.
  45.     La estructuració de GRAPH (i açó és nou en aquesta versió) fa que en
  46.   compte de cridar a les funcions d'una llibreria de la que no tens (o no
  47.   deuries tindre) el llistat font, crides a una macro (alternativa 1 en
  48.   assembler) o a un procediment (alternativa 2 en assembler i resta de llen-
  49.   guatges) que es troba en un fitxer d'inclusió completament modificable.
  50.   I tot açó auxiliat per un sistema de tractament i detecció d'errors prou
  51.   potent (mira el menú «El sistema d'errors»).$$
  52. %%202
  53.  
  54.        FILOSOFIA DE GRAPH
  55.  
  56.     La filosofía que adopta GRAPH es una de las más sencillas que se podria
  57.   coger. GRAPH funciona por handles, es decir, cuando tu llamas a alguna fun-
  58.   ción, el sistema te devuelve un valor con el que podrás referirte despues a
  59.   una pantalla virtual, una paleta, etc.
  60.     Por ejemplo, desde el ensamblador podrias escribir:
  61.  
  62.         CALL    CreaVirtual
  63.         MOV     [HandlePV], AL
  64.  
  65.   i despues referirte a esta pantalla virtual con el valor que has colocado
  66.   en la variable "HandlePV":
  67.  
  68.         MOV     AL, [HandlePV]
  69.         MOV     AH, 0
  70.         CALL    CopiaPantalla
  71.  
  72.   Así de sencillo y así de potente. En otros lenguajes como en C podriamos
  73.   escribir lo siguiente:
  74.  
  75.         byte handle1;
  76.         handle1=CreaVirtual();
  77.         CopiaPantalla(handle1, 0);
  78.  
  79.     Con este sistema podremos olvidarnos de las bibliotecas gráficas que
  80.   nos devuelven segmentes y offsets que pueden volvernos locos en grandes
  81.   proyectos.
  82.     Otro punto importante a tener en cuenta cuando trabajamos con GRAPH són
  83.   las funciones del tipo "fast" que nos permiten elegir entre una función un
  84.   poco más rápida o otra con más control d'errors. Estas funciones se llaman
  85.   anteponiendo una `f∩. Por ejemplo, la función "PonPixel" es fast, podremos
  86.   llamarla de estas dos maneras:
  87.  
  88.         PonPixel(x, y, 16, 0);
  89.         fPonPixel(x, y, 16, 0);
  90.  
  91.   la primera nos dará más información sobre errores, mientras la segunda será
  92.   un poco más rápida, pero con menos errores. Tambien se diferencian en que
  93.   la primera, con las funciones que lo permitan, se aplicará las técnicas de
  94.   clipping o recorte.
  95.     La estructuración de GRAPH (i esto es nuevo esta versión) hace que en
  96.   lugar de llamar a las funciones de una libreria de la que no tienes (o no
  97.   deberias tener) el código fuente, llames a una macro (alternativa 1 en
  98.   assembler) o a un procedimiento (alternativa 2 en assembler y el resto de
  99.   lenguajes) que se encuentran en un fichero de inclusión completamente modi-
  100.   ficable. I todo esto ayudado por un sistema de tractamiento y detección de
  101.   errores bastante potente (mira el menú «El sistema de errores»).$$
  102. %%302
  103.     I'm sorry :-( Information not available in english.
  104.     Write me a post card to receive some help. Thank you :-)$$
  105. %%103
  106.        ELS MODES GRAFICS
  107.  
  108.     El primer que hauria de dir-se dels modes gràfics és que són el que
  109.   defineix cuants pixels i cuants colors podem tenir al mateix temps en la
  110.   pantalla i un altre aspecte més difícil de veure però molt important: les
  111.   planes gràfiques.
  112.     En aquesta segona versió de GRAPH hi han 3 modes gràfics que s'elegeixen
  113.   al (re)iniciar el sistema GRAPH (mitjançant "InicGRAPH" o "ResetGRAPH").
  114.   En 2 d'aquestos modes podem obtenir el doble de resolució vertical amb la
  115.   funció "DoblaLineas" (mira el menú «Funcions avançades»).
  116.     Els modes gràfics que podem cridar són aquestos:
  117.  
  118.                 1  -->  320x200x256c i 1 plana.   --> Nom: Mode 13h
  119.                 2  -->  320x200x256c i 4 planes.  --> Nom: Mode 13X
  120.                 3  -->  320x240x256c i 3 planes.  --> Nom: Mode X
  121.  
  122.     Cada mode gràfic presenta les seues ventajes i els seus inconvenients.
  123.   El primer és el més ràpid per a la majoría d'operacions, però presenta el
  124.   serios inconvenient de que nomes té una plana de memoria i, per aixó,
  125.   haurem de demanar totes les planes que ens calguen perdent memoria RAM.
  126.   El segón mode és més lent que el 13h, però, en ell ja disposem de planes
  127.   suficients per a la majoria d'aplicacions que fem. També té la ventaja de
  128.   que fer un scroll en mode 13X és infinitament més senzill que fer-ho en el
  129.   13h (mira el menú «Funcions avançades»).
  130.     El darrer mode és mereix una explicació a banda. El mode X és un mode
  131.   molt conegut pels programadors de jocs (especialment en 3D) i de demos ja
  132.   que permet que els pixels siguen cuadrats i, per aixó, cuan dibuixem un
  133.   cercle serà un cercle i no una el·lipse o un cuadrat no serà un rectangle.
  134.   Aquest mode el va descobrir Michael Abrash i al no ser un mode estandard de
  135.   la VGA es sol dir que pot causar problemes del tipus de incompatibilitats.
  136.   En la pràctica, però, no tindrem cap problema en emprar aquestes funcions.
  137.   El mode X té les mateixes ventajes i inconvenients que el 13X a més de la
  138.   ventaja dels pixels cuadrats.$$
  139. %%203
  140.        LOS MODOS GRAFICOS
  141.  
  142.     Lo primero que deberia decirse de los modos gráficos es que són lo que
  143.   define cuantos pixels y cuantos colores pueden tenerse al mismo tiempo en
  144.   la pantalla y el número de páginas de video que existen.
  145.     En esta segunda versión de GRAPH hay 3 modos gráficos que se eligen al
  146.   (re)iniciar el sistema GRAPH (mediante "InicGRAPH" o "ResetGRAPH"). En 2 de
  147.   estos modos podemos obtener el doble de resolución vertical con la función
  148.   "DoblaLineas" (mira el menú «Funciones avanzadas»).
  149.     Los modos gráficos que podemos llamar son estos:
  150.  
  151.                 1  -->  320x200x256c i 1 pag.   --> Nom: Mode 13h
  152.                 2  -->  320x200x256c i 4 pag.   --> Nom: Mode 13X
  153.                 3  -->  320x240x256c i 3 pag.   --> Nom: Mode X
  154.  
  155.     Cada modo gráfico tiene sus ventajas y sus inconvenientes. El primero es
  156.   el más rápido para la mayoría de operaciones, pero presenta el gran incon-
  157.   veniente de que sólo tiene una página de memoria y, por eso, tendremos que
  158.   pedir todas las páginas que necesitemos de RAM. El segundo modo es más lento
  159.   que el 13h, pero en el ya disponemos de páginas suficientes para la mayoria
  160.   de aplicaciones. Tambien tiene la ventaja de que hacer un scroll en modo 13X
  161.   es infinitamente más sencillo que en el modo 13h (mira el menú «Funciones
  162.   avanzadas»).
  163.     El último modo merece una explicación a parte. El mode X és un modo muy
  164.   conocido por los programadores de juegos (especialmente en 3D) y de demos
  165.   ya que permite que los pixels sean cuadrados y, por eso, cuando dibujemos
  166.   un cículo será un círculo y no una elipse o un cuadrado no será un rectan-
  167.   gulo. Este modo lo descubrio Michael Abrash y como no es un modo estandard
  168.   de la VGA se suele decir que puede causar problemas de incompatibilidad.
  169.   En la práctica no tendremos ningún problema al usar estas funciones. El
  170.   mode X tiene las mismas ventajas e inconvenientes que el 13X además de la
  171.   ventaja de los pixels cuadrados.$$
  172. %%303
  173.     I'm sorry :-( Information not available in english.
  174.     Write me a post card to receive some help. Thank you :-)$$
  175. %%104
  176.        ARXIUS MAD
  177.  
  178.     MAD és l'extensió que adopten els arxius amb el format MADff que són les
  179.   sigles angleses de «Multi-Archive Designation File Format» i que ens van a
  180.   servir per a empaquetar o magatzemar tots els fitxers individuals que tinga
  181.   un programa, joc o demo en un únic fitxer més gran.
  182.     Açó ens serà de molta utilitat per a millorar l'aspecte global del nostre
  183.   programa per que, ¿a qui li agrada fer un "dir" en un directori i trobar-se
  184.   amb 40 fitxers? Queda molt poc elegant i si es pot evitar hem d'evitar-ho.
  185.     La pregunta és ara ¿perque MADff i no altre tipus? Podria haver emprat
  186.   el format WAD (com el DOOM o l'HERETIC) o algún format d'aquestos que fun-
  187.   cionen per CHUNKS (com el dels fitxers WAV o PNG), però, en aquestos for-
  188.   mats hi ha un gran problema que és el de les licencies, es a dir, que hi ha
  189.   que pagar (o al menys obtenir un permís) per a emprar-los. Per aixó vaig
  190.   escollir el format MADff (a banda de que és molt més senzill que els altres
  191.   formats que conec) i per aixó vaig programar un petita aplicació que ens
  192.   permetrà fer un MAD a partir dels fitxers individuals: MAD-MAKER. Un altra
  193.   raó de l'elecció del format MAD és que s'adapta molt bé a la filosofia de
  194.   GRAPH, a la utilització mitjançant handles (encara que en la versió 2.0 no
  195.   s'ha implementat aquesta possibilitat).
  196.     No explicaré ací altra vegada el funcionament de MAD-MAKER que és molt
  197.   senzill i té un arxiu de text explicant-ho, a més a més dels fonts, però
  198.   sí voldría cridar l'atenció de tots els coders que vulguen col·laborar
  199.   per a que intenten millorar-lo i me'l envien per a distribuir-lo en la
  200.   següent versió. El format MADff podeu consultar-lo en el fitxer anomenat
  201.   "MADFF.TXT" i que està en el mateix directori que el MAD-MAKER.$$
  202. %%204
  203.        ARCHIVOS MAD
  204.  
  205.     MAD es la extensión que adoptan los archivos con el formato MADff que son
  206.   las siglas inglesas de «Multi-Archive Designation File Format» y que nos van
  207.   a servir para empaquetar o almazenar todos los ficheros individuales que
  208.   tenga un programa, juego o demo en un único fichero más grande.
  209.     Esto nos será de mucha utilidad para mejorar el aspecto global de nuestro
  210.   programa por que, ¿a quien le gusta hacer un "dir" en un directorio y encon-
  211.   trarse con 40 ficheros? Queda muy poco elegante y si se puede evitar tenemos
  212.   que hacerlo.
  213.     La pregunta que queda es ¿porque MADff y no otro tipo? Podri haber usado
  214.   el formato WAD (como el DOOM o el HERETIC) o algún formato de estos que
  215.   funcionan por CHUNKS (como el de los ficheros WAV o PNG), pero estos for-
  216.   matos tienen el gran problema de las licencias, es decir, que hay que pagar
  217.   (o obtener un permiso) para usarlos. Por eso decidí elegir el formato MADff
  218.   (a parte de que es mucho más sencillo que el resto de formatos que conozco)
  219.   i por eso programé una pequeña aplicación que nos permitirá hacer un MAD
  220.   a partir de ficheros individuales: MAD-MAKER. Otra razón de la elección del
  221.   formato MAD es que se adapta muy bien a la filosofía de GRAPH, a la utili-
  222.   zación mediante handles (aunque en esta versión 2.0 no se implemente esta
  223.   posibilidad).
  224.     No explicaré aquí otra vez el funcionamento de MAD-MAKER que es muy
  225.   sencillo y tiene un archivo de texto explicandolo, además del código fuente,
  226.   pero sí querría llamar la atención de todos los coders que quieran colaborar
  227.   para que intenten mejorarlo y me lo envien para distribuirlo en la siguiente
  228.   versión. El formato MADff lo podeis consultar en el fichero llamado
  229.   "MADFF.TXT" y que está en el mismo directorio que el MAD-MAKER.$$
  230. %%304
  231.     I'm sorry :-( Information not available in english.
  232.     Write me a post card to receive some help. Thank you :-)$$
  233. %%105
  234.        EL MODE FLAT. DE LA TEORIA A LA PRACTICA.
  235.  
  236.     El mode flat és un clónic entre el mode real i el mode protegit del
  237.   procesador (bé, no és un clónic, però es pot dir així 8-). El que ens
  238.   interesa és que es tracta de una nova forma de treballar (per al proce-
  239.   sador) en la cual tenim acces a 4Gb de memoria RAM.
  240.     Aixó és així en teoria al menys, per que si demanem 1 sol giga, ens van
  241.   a enviar a... Vaja, que en compte de 4Gb tindrem la memoria que el usuari
  242.   dispose fisicament menys la memoria ocupada (que pot saber-se fent un "mem"
  243.   o emprant la funció "MaximaXMS").
  244.     No ens hem de confundir, no és el mateix la memoria XMS que nosaltres
  245.   demanarem i la que ens proporciona el driver EMM386 (en realitat la memoria
  246.   és la mateixa, el que canvia són les formes). El que anomenarem memoria
  247.   XMS i que ens proporcionaran les funcions del mode flat és tota la memoria
  248.   per dalt del primer mega.
  249.     El mode flat s'ha d'iniciar, però no és necesari que és finalitze per que
  250.   per als programes normals no hi ha cap canvi. La manera de treballar del
  251.   programador tampoc hauria de canviar (o al menys no necessariament). Téc-
  252.   nicament el que fa GRAPH per a iniciar el mode flat és entrar en mode
  253.   protegit canviar el selector de segment per a que aquest segment tinga una
  254.   llargaría de 4Gb (o tota la memoria disponible) i tornar al mode real.
  255.     Una volta iniciat el mode flat podrem olvidar-se en certa manera de les
  256.   limitacions que imposen els segments de 64Kb i la barrera (psicológica) del
  257.   primer Mb. Podrem fer des de l'assembler açó, per exemple:
  258.  
  259.         XOR     AX, AX
  260.         MOV     DS, AX
  261.         XOR     EDI, EDI
  262.         MOV     DL, 90h
  263.         MOV     ECX, 16*1024*1024
  264.      Bucle:
  265.         MOV     DS:[EDI], DL
  266.         DEC     ECX
  267.         JNZ    Bucle
  268.  
  269.   Amb el que plenariem els primers 16Mb (si l'usuari els tenira) amb el valor
  270.   90h (un NOP) i com no ens trobariem en mode protegit, tan sols estariem en
  271.   el mode flat, cuan el programa ens sobre-escribira (per que ens trobariem
  272.   al primer mega), ens quedariem penjats o s'ejecutarien les instruccions de
  273.   darrere del bucle.
  274.     Una cosa que s'ha de tenir en compte sempre que vulgam accedir a la memo-
  275.   ria superior és que hem de tenir habilitada la linia A20 i si no es penjarà
  276.   o escriurem on no es deu d'escriure (per les lleis de Murphie). Però, com
  277.   es pot habilitar aixó? Doncs jo ho faig amb una rutineta interna de GRAPH
  278.   cada volta que es va a copiar de o des de la memoria alta. Has de saber que
  279.   si es col·loca la linia aquesta en ON o en OFF, ella sola no es canviarà,
  280.   per aixó es suposa que una volta has inicialitzat el mode flat (a l'hora
  281.   que GRAPH mitjançant un bit en les flags) i has cridat a una funció que
  282.   cópie de o des de memoria alta, la linia quedarà habilitada per sempre.
  283.   Açó és, com sempre, pura teoria, però. Per inexplicables raons, el driver
  284.   HIMEM la majoria de voltes que es cridat deshabilita la A20. Si tens
  285.   problemes escribint o llegint de memoria alta, ja saps el que passa i ja
  286.   saps la solució (una postal).
  287.     Després de l'anterior paràgraf podries pensar "Desinstal·lem el driver
  288.   aquest i problema solucionat", però si ho feres obtindries el error 11h
  289.   i no podries entrar en GRAPH. Sí, l'error 11h és «HIMEM no encontrado» i
  290.   és absolutament necessari per a GRAPH que HIMEM estigui en memoria si
  291.   es va a usar el mode flat. No podem viure amb ell, però tampoc sense ell;
  292.   quin dilema!
  293.  
  294.        US DEL MODE FLAT.
  295.  
  296.     Per a emprar el mode flat de manera "politicament correcta" amb GRAPH no
  297.   hauries de modificar directament la memoria alta (encara que eres lliure
  298.   de fer el que et vinga en gana per que estás en DOS i no un d'aquestos
  299.   sistemes operatius manipuladors i controladors).
  300.     Et recomane que sols faces servir les funcions "GuardaFlat" i "CargaFlat"
  301.   que serveixen per a copiar a memoria alta i des de memoria alta respectiva-
  302.   ment. Tots els tipus de dades que empra GRAPH v2.0 poden ser copiades amb
  303.   aquestes funcions respectant la filosofia de GRAPH que diu que s'han de
  304.   emprar handles per a tot.
  305.     Però si vols eixir-te de la norma i anar, literalment, "a la aventura",
  306.   podrás emprar les funcions "PideXMS", "LiberaXMS", etc. Fes el que millor
  307.   et parega, però recorda que jo no em faig responsable de les destrosses
  308.   que puguera causar GRAPH.$$
  309. %%205
  310.        EL MODO FLAT. DE LA TEORIA A LA PRACTICA.
  311.  
  312.     El modo flat es un clónico entre el modo real y el modo protegido del
  313.   procesador (vale, no es un clónico, pero se puede decir así 8-). Lo que nos
  314.   interesa es que se trata de una nueva forma de trabajar (para el procesador)
  315.   en la cual tenemos acceso a 4Gb de memoria RAM.
  316.     Eso es así en teoria el menos, por que si pedimos aunque sólo sea 1 giga,
  317.   nos van a enviar a... Vamos, que en lugar de tener 4Gb, tenemos la memoria
  318.   que el usuario disponga físicamente menos la memoria ocupada (que puede
  319.   averiguarse con un "mem" o con la función `MaximaXMS∩).
  320.     No tenemos que confundirnos, no es lo mismo la memoria XMS que nosotros
  321.   pedimos y la que nos proporciona el driver EMM386 (aunque la memoria es la
  322.   misma, lo que cambia son las formas). Lo que llamaremos memoria XMS y que
  323.   nos proporcionaran las funciones del modo flat es toda la memoria por
  324.   encima de 1 mega.
  325.     El modo flat se ha de iniciar, peroa no es necesario que se finalize por
  326.   que para los programas normales no hay ningún cambio. La forma de trabajar
  327.   del programador tampoco tendria que cambiar (o al menos no necesariamente).
  328.   Técnicamente lo que hace GRAPH para iniciar el modo flat es entrar en modo
  329.   protegido, cambiar el selector de segmento para que éste segmento tenga una
  330.   longitud de 4Gb y vuelve al modo real.
  331.     Una vez iniciado el modo flat podremos olvidarnos en cierta manera de las
  332.   limitaciones que imponen los segmentos de 64Kb y la barrera (psicológica)
  333.   del primer Mb. Podremos hacer desde el assembler esto, por ejemplo:
  334.  
  335.         XOR     AX, AX
  336.         MOV     DS, AX
  337.         XOR     EDI, EDI
  338.         MOV     DL, 90h
  339.         MOV     ECX, 16*1024*1024
  340.      Bucle:
  341.         MOV     DS:[EDI], DL
  342.         DEC     ECX
  343.         JNZ    Bucle
  344.  
  345.   Con lo que llenariamos los primeros 16Mb (si el usuario los tuviera) con el
  346.   valor 90h (un NOP) y como no estariamos en mode protegido cuando el programa
  347.   nos sobre-escribiera (por que nos encontrariamos en el primer mega), nos
  348.   quedariamos colgados o se ejecutarian las instrucciones de detras del bucle.
  349.     Una cosa que se ha de tener en cuenta siempre que queramos acceder a la
  350.   memoria superior es que tenemos que tener habilitada la linea A20 y si no
  351.   se colgarà o escribiremos donde no se debe escribir (por las leyes de
  352.   Murphie). Pero, ¿como se puede habilitar eso? Pues yo lo hago con una ruti-
  353.   nita interna de GRAPH cada vez que se va a copiar de o desde la memoria alta.
  354.   Has de saber que si se coloca la linea esa en ON o en OFF, ella sola no se
  355.   cambiará, por eso se supone que una vez has inicializado el modo flat (a
  356.   la vez que GRAPH mediante un bit en las flags) y has llamado a una función
  357.   que cópie de o desde memoria alta, la linea quedará habilitada para siempre.
  358.   Esto és, como siempre, pura teoria. Por inexplicables razones, el driver
  359.   HIMEM la mayoria de veces que se llama deshabilita la A20. Si tienes
  360.   problemas escribiendo o leyendo de memoria alta, ya sabes que pasa y ya
  361.   sabes la solución (una postal).
  362.     Despues del anterior párrafo podrias pensar "Desinstalamos el driver
  363.   ese y problema solucionado", pero si lo hicieras obtendrias el error 11h
  364.   y no podrias entrar en GRAPH. Sí, el error 11h es «HIMEM no encontrado» y
  365.   es absolutamente necesario para GRAPH que el HIMEM esté en memoria si es
  366.   que se va a usar el modo flat. No podemos vivir con él, pero tampoco sin
  367.   él; ¡Que dilema!
  368.  
  369.        USO DEL MODO FLAT.
  370.  
  371.     Para usar el modo flat de manera "politicamente correcta" con GRAPH no
  372.   tendrias que modificar directamente la memoria alta (aunque eres libre
  373.   de hacer lo que te de la gana por que estás en DOS y no uno de esos
  374.   sistemas operativos manipuladores).
  375.     Te recomiendo que sólo uses las funciones "GuardaFlat" y "CargaFlat" que
  376.   sirven para copiar a y desde memoria alta. Todos los tipos de datos que usa
  377.   GRAPH v2.0 pueden ser copiadas con estas funciones respetando la filosofía
  378.   de GRAPH que dice que se han de usar handles.
  379.     Pero si quieres salirte de la norma y ir, literalmente, "a la aventura",
  380.   podrás usar las funciones "PideXMS", "LiberaXMS", etc. Haz lo que te parez-
  381.   ca, pero recuerda que yo no me hago cargo de los posibles destrozos que
  382.   pueda causar GRAPH.$$
  383. %%305
  384.     I'm sorry :-( Information not available in english.
  385.     Write me a post card to receive some help. Thank you :-)$$
  386. %%106
  387.        ELS MISSATGES D'ERROR
  388.  
  389.     A continuació trobaràs la llista de tots els missatges d'error que pot
  390.   produir GRAPH v2.0 i una descripció de que són.
  391.  
  392.       00. Fallo General
  393.     Aquest error pot apareixer en una gran cuantitat de funcions. Normalment,
  394.    es pot solucionar canviant els paràmetres d'alguna funció, es a dir, és
  395.    un error provocat pel programador al introduir valors incorrectes (encara
  396.    que pot produir-se en altres circumstàcies).
  397.  
  398.       01. No quedan handles libres.
  399.     Aquest error significa "No hi ha handles lliures" i pot apareixer en les
  400.    funcions que tornen un handle. El que passa és que no hi han suficients
  401.    handles lliures com per a magatzemar un altre més. Per exemple, si tenim
  402.    5 handles de PV i hem demanat els 5, cuan cridem a "CreaVirtual" obtindrem
  403.    un error.
  404.  
  405.       02. Frame no existente.
  406.     Error que produeixen les funcions (f)PonFrameAnima i que es produeix cuan
  407.    volem que es dibuixe un frame o image que no existeix.
  408.  
  409.       03. No hay suficiente memoria libre.
  410.     Significa "No hi ha suficient memoria lliure" i apareix cuan la memoria
  411.    convencional o memoria baixa es massa petita per a la PV, l'sprite, etc.
  412.    que li estem demanat. Es pot solucionar amb la memoria alta (mode flat) o
  413.    lliberant zones de memoria.
  414.  
  415.       04. Intento de liberar bloque no reservado.
  416.     Significa "Intent de lliberar bloc no reservat". Pot apareixer cuan
  417.    cridem a les funcions `DestXXXXX∩ o amb `VaciaMEM∩ i sol deures a que
  418.    intentem lliberar una zona de memoria que no haviem demanat.
  419.  
  420.       05. Bloque no válido.
  421.     Aquest error el podem trobar a tot arreu i és difícil dir com solucio-
  422.    nar-lo. Revisa el programa que l'ha produit.
  423.  
  424.       06. Sprites demasiado grandes.
  425.     Una limitació del procesador en mode real és que els segments, com a
  426.    màxim, poden tenir 64Kb. Si es passa aquesta barrera en el tamany que pot
  427.    ocupar un sprite, es produeix aquest error. Fes sprites més petits.
  428.  
  429.       07. Error en el acceso a disco.
  430.     Es tracta d'un error comú que apareix cuan es produeix un error de disc.
  431.    Revisa el programa que produeix l'error.
  432.  
  433.       08. Intento de eliminación VGA.
  434.     Aquest error es produeix únicament cuan cridem a la funció `DestVirtual∩
  435.    per a destruir la PV nº0 que es la assignada a la VGA.
  436.  
  437.       09. Coordenadas de pantalla incorrectas.
  438.     Es produeix en les funcions que no accepten clipping. Hi ha que tenir en
  439.    compte les màximes coordenades (i les mínimes) que poden acceptar les
  440.    diferent funcions.
  441.  
  442.       0A. Archivo gráfico no válido.
  443.     Es produeix cuan un fitxer gràfic o no té un error en la capçalera o
  444.    simplement no és el que es supossa que deuria ser. Per exemple, cuan
  445.    cridem a `PlayFLI∩ passant-li la direcció de un fitxer PCX.
  446.  
  447.       0B. Error básico en fuente.
  448.     Aquest error sols es produeix cuan treballem en fonts i pot ser causat
  449.    per qualssevol tipus d'error amb una font.
  450.  
  451.       0C. Error en la introducción de datos.
  452.     Aquest error es produeix en la introducció de paràmetres a una funció.
  453.    Té algunes similituds amb l'error nº0.
  454.  
  455.       0D. Desbordamiento.
  456.     Es produeix pel típic desbordament de registre en ensamblador. Pot ser
  457.    causat per una erronea introducció de dades.
  458.  
  459.       0E. Función no disponible en este modo.
  460.     Hi han funcions com `Flip∩ que en determinats modes gràfics no poden ser
  461.    usades. Per exemple `Flip∩ no té cap utilitat en els modes no planars.
  462.  
  463.       0F. No existe página de visualización.
  464.     Cuan s'intenta canviar a una plana de VRAM que no existeix es produeix
  465.    aquest error.
  466.  
  467.       10. Nos encontramos en modo V86.
  468.     El mode flat sols pot funcionar si ens trobem en el sistema lliure de
  469.    controladors de memoria XMS. Per a que deixe de donar aquest error,
  470.    desinstal·la els drivers del tipus EMM386, QUEM, etc.
  471.  
  472.       11. Controlador HIMEM no encontrado.
  473.     El mode flat necessita tenir instal·lat el controlador HIMEM. Instal·la'l
  474.    per a que desaparega aquest error.
  475.  
  476.       12. No hay suficiente memoria superior.
  477.     Es tracta de l'error homòleg del nº3 en memoria superior. Per a solucio-
  478.    nar-lo llibera memoria superior (amb `LiberaXMS∩ o `CargaFlat∩).
  479.  
  480.       13. Procesador 80386 o superior no encontrado.
  481.     Aquest error apareix cuan no es pot detectar un procesador 80386+ durant
  482.    el procés d'initcialització (funció `InicGRAPH∩).
  483.  
  484.     A part de tots aquestos errors pot apareixer un altre anomenat "Error
  485.   general del sistema de errores" ("Error general del sistema d'errors")
  486.   que apareix cuan un error no identificat (major del 13h) s'intenta tractar
  487.   amb `TrataError∩.$$
  488. %%206
  489.        LOS MENSAGES DE ERROR
  490.  
  491.     A continuación encontrarás la lista de todos los mensages de error que
  492.   puede producir GRAPH v2.0 y una descripción de que son.
  493.  
  494.       00. Fallo General
  495.     Este error puede aparecer en una gran cantidad de funciones. Normalmente,
  496.    se puede solucionar cambiando los parámetros de alguna función, es decir,
  497.    es un error provocado por el programador al introducir valores incorrectos
  498.    (aunque puede producirse en otras circunstacias).
  499.  
  500.       01. No quedan handles libres.
  501.     Este error puede aparecer en las funciones que devuelven un handle. Lo que
  502.    pasa es que no hay suficientes handles libres como para almacenar otro más.
  503.    Por ejemplo, si tenemos 5 handles de PV y hemos pedido los 5, cuando llame-
  504.    mos a "CreaVirtual" obtendremos un error.
  505.  
  506.       02. Frame no existente.
  507.     Error que producen las funciones (f)PonFrameAnima y que se produce cuando
  508.    queremos que se dibuje un frame o imagen que no existe.
  509.  
  510.       03. No hay suficiente memoria libre.
  511.     Aparece cuando la memoria convencional o memoria baja es demasiado pequeña
  512.    para la PV, el sprite, etc. que le estamos pidiendo. Se puede solucionar
  513.    con la memoria alta (modo flat) o liberando zonas de memoria.
  514.  
  515.       04. Intento de liberar bloque no reservado.
  516.    Puede aparecer cuando llamamos a las funciones `DestXXXXX∩ o con `VaciaMEM∩
  517.    y suele deberse a que intentemos liberar una zona de memoria que no habia-
  518.    mos pedido.
  519.  
  520.       05. Bloque no válido.
  521.     Este error lo podemos encontrar por cualquier sítio y es difícil decir
  522.    como solucionarlo. Revisa el programa que lo ha producido.
  523.  
  524.       06. Sprites demasiado grandes.
  525.     Una limitación del procesador en modo real es que los segmentos, como
  526.    máximo, pueden tener 64Kb. Si se pasa esta barrera en el tamaño que puede
  527.    ocupar un sprite, se produce este error. Haz sprites más pequeños.
  528.  
  529.       07. Error en el acceso a disco.
  530.     Se trata de un error común que aparece cuando se produce un error de
  531.    disco. Revisa el programa que produce el error.
  532.  
  533.       08. Intento de eliminación VGA.
  534.     Este error se produce únicamente cuando llamamos a la función
  535.    `DestVirtual∩ para destruir la PV nº0 que es la asignada a la VGA.
  536.  
  537.       09. Coordenadas de pantalla incorrectas.
  538.     Se produce en las funciones que no aceptan clipping. Hay que tener en
  539.    cuenta las máximas coordenadas (y las mínimas) que pueden aceptar las
  540.    diferentes funciones.
  541.  
  542.       0A. Archivo gráfico no válido.
  543.     Se produce cuando un fichero gráfico o tiene un error en la cabecera
  544.    o simplemente no es lo que se supone que deberia ser. Por ejemplo, cuando
  545.    llamemos a `PlayFLI∩ pasandole la dirección de un fichero PCX.
  546.  
  547.       0B. Error básico en fuente.
  548.     Este error sólo se produce cuando trabajamos con fuentes y puede ser
  549.    causado por cualquier tipo de error con una fuente.
  550.  
  551.       0C. Error en la introducción de datos.
  552.     Este error se produce en la introducción de parámetros a una función.
  553.    Tiene algunas similitudes con el error nº0.
  554.  
  555.       0D. Desbordamiento.
  556.     Se produce por el típico desbordamiento de registro en ensamblador. Puede
  557.    ser causado por una erronea introducción de datos.
  558.  
  559.       0E. Función no disponible en este modo.
  560.     Hay funciones como `Flip∩ que en determinados modos gráficos no pueden
  561.    ser usadas. Por ejemplo `Flip∩ no tiene ninguna utilidad en los modos no
  562.    planares.
  563.  
  564.       0F. No existe página de visualización.
  565.     Cuando se intenta cambiar a una página de VRAM que no existen se produce
  566.    este error.
  567.  
  568.       10. Nos encontramos en modo V86.
  569.     El modo flat sólo puede funcionar si nos encontramos con el sistema libre
  570.    de controladores de memoria XMS. Para que deje de dar este error, desins-
  571.    tala los drivers del tipo EMM386, QUEM, etc.
  572.  
  573.       11. Controlador HIMEM no encontrado.
  574.     El modo flat necessita tener instalado el controlador HIMEM. Instalalo
  575.    para que desaparezca este error.
  576.  
  577.       12. No hay suficiente memoria superior.
  578.     Se trata del error homólogo del nº3 en memoria superior. Para solucionarlo
  579.    libera memoria superior (con `LiberaXMS∩ o `CargaFlat∩).
  580.  
  581.       13. Procesador 80386 o superior no encontrado.
  582.     Este error aparece cuando no se puede detectar un procesador 80386+
  583.    durante el proceso de inicialización (función `InicGRAPH∩).
  584.  
  585.     A parte de todos estos errores puede aparecer otro llamado "Error general
  586.   del sistema de errores" que aparece cuando un error no identificado (mayor
  587.   del 13h) se intenta tratar con `TrataError∩.$$
  588. %%306
  589.     I'm sorry :-( Information not available in english.
  590.     Write me a post card to receive some help. Thank you :-)$$
  591. %%107
  592.        UTILITATS ADICIONALS
  593.  
  594.     Junt a GRAPH v2.0 apareixen uns cuants programes d'utilitat que t'aju-
  595.   daran a traure-li més partit a GRAPH. Aquestes s'expliquen totes en els
  596.   fitxers de text que es poden trobar en el mateix directori que el programa.
  597.   La major part d'elles tenen el font per a que l'adeques al teu gust o a les
  598.   teues necessitats.$$
  599. %%207
  600.        UTILIDADES ADICIONALES
  601.  
  602.     Junto a GRAPH v2.0 aparecen unos cuantos programas de utilidad que te ayu-
  603.   daran a sacarle más partido a GRAPH. Estos se explican todos en los ficheros
  604.   de texto que se pueden encontrar en el mismo directorio que el programa. La
  605.   mayor parte de ellas tienen el código fuente para que los adecues a tu gusto
  606.   o a tus necesidades.$$
  607. %%307
  608.     I'm sorry :-( Information not available in english.
  609.     Write me a post card to receive some help. Thank you :-)$$
  610. %%108
  611.        EL SISTEMA DE TRACTAMENT D'ERRORS
  612.  
  613.     Un subsitema fonamental en GRAPH és el de tractament d'errors. En la
  614.   llista de funcions trobaràs algunes que diu "Sí" en l'apartat de STDERR.
  615.   Aquestes són les funcions que funcionen amb el sistema de tractament
  616.   d'errors de GRAPH, les altres no produeixen errors (encara que si que
  617.   tinguen).
  618.     Per a detectar un error després de cridar a una funció es pot fer el
  619.   següent:
  620.  
  621.      ■ Cridar a la funció.
  622.      ■ SI ENS TROBEM EN ASSEMBLER: Comprobar el valor del carry flag.
  623.      ■ Comprobar el valor de la variable pública "LERROR".
  624.      ■ Si "LERROR" té en el byte menys significatiu un 0FFh hi ha error.
  625.      ■ El error és el que indica el byte més significatiu.
  626.  
  627.     Com val més una image que mil paraules, aquí va un exemple en assembler
  628.   i altre en C:
  629.  
  630.            .....
  631.         MOV     AL, 0
  632.         DestVirtual
  633.         JNC   @@NoHayError
  634.         MOV     AX, LERROR
  635.         INC     AL
  636.         JNZ   @@NoHayError
  637.         MOV     AL, AH
  638.         MOV     AH, 4Ch
  639.         INT     21h
  640.     @@NoHayError:
  641.            .....
  642.  
  643.            .....
  644.         DestVirtual(0);
  645.         if((LERROR & 0xFF)==0xFF)
  646.           exit(LERROR>>8);
  647.            .....
  648.  
  649.     Aquestos dos exemples fan el mateix, criden a la funció `DestVirtual∩
  650.   amb un paràmetre incorrecte (s'intenta destruir la VGA) i després es
  651.   comproba si hi ha error. En cas afirmatiu es surt al DOS amb el ERRORLEVEL
  652.   del error produit en GRAPH i si no hi ha error es continua.
  653.     És necessari remarcar que des de l'assembler tenim la carry flag que ens
  654.   indica si hi ha o no error, però des de C o altres llenguatges hem de mirar
  655.   solament la variable LERROR, per aixó, és important borrarla (fer que valga
  656.   0) després de cada error (sempre que no surtim al DOS amb cada error).
  657.  
  658.        LA FUNCIα "TRATAERROR"
  659.  
  660.     Per a automatizar el procés de tractament d'errors existeix una funció
  661.   anomenada `TrataError∩ que si hi ha error ho escriu en la pantalla i a la
  662.   nostra elecció surt o no al DOS. Per a decidir si surt o no al DOS ho hem
  663.   de fer saber cuan cridem a la funció `InicGRAPH∩ o `ResetGRAPH∩.
  664.     La funció `TrataError∩ ha d'apareixer seguidament de la funció que volem
  665.   saber si ha produit un error i si no és així pot donar resultats extranys.
  666.   Queden més cosses per dir del subsistema de tractament d'errors, però no
  667.   se m'ocurreixen ara :-O $$
  668. %%208
  669.        EL SISTEMA DE TRATAMIENTO DE ERRORES
  670.  
  671.     Un subsistema fundamental en GRAPH es el de tratamiento de errores. En la
  672.   lista de funciones encontrarás algunas que dice "Sí" en el apartado de
  673.   STDERR. Estas son las funciones que funcionan con el sistema de tratamiento
  674.   de errores de GRAPH, las otras no producen errores (aunque si que tengan).
  675.     Para detectar un error despues de llamar a una función se puede hacer lo
  676.   siguiente:
  677.  
  678.      ■ Llamar a la función.
  679.      ■ SI ESTAMOS EN ASSEMBLER: Comprobar el valor del carry flag.
  680.      ■ Comprobar el valor de la variable pública "LERROR".
  681.      ■ Si "LERROR" tiene en el byte menos significativo un 0FFh hay error.
  682.      ■ El error es el que indica el byte más significativo.
  683.  
  684.     Como vale más una imagen que mil palabras, ahí va un ejemplo en assembler
  685.   i otro en C:
  686.  
  687.            .....
  688.         MOV     AL, 0
  689.         DestVirtual
  690.         JNC   @@NoHayError
  691.         MOV     AX, LERROR
  692.         INC     AL
  693.         JNZ   @@NoHayError
  694.         MOV     AL, AH
  695.         MOV     AH, 4Ch
  696.         INT     21h
  697.     @@NoHayError:
  698.            .....
  699.  
  700.            .....
  701.         DestVirtual(0);
  702.         if((LERROR & 0xFF)==0xFF)
  703.           exit(LERROR>>8);
  704.            .....
  705.  
  706.     Estos dos ejemplos hacen lo mismo, llaman a la función `DestVirtual∩ con
  707.   un parámetro incorrecto (se intenta destruir la VGA) y despues se comprueba
  708.   si hay error. En caso afirmativo se sale al DOS con el ERRORLEVEL del error
  709.   producido en GRAPH y si no hay error se continua.
  710.     Es necesario remarcar que desde assembler tenemos la carry flag que nos
  711.   indica si hay o no error, pero desde C u otros lenguajes hemos de mirar
  712.   solament la variable LERROR, por eso, es importante borrarla (hacer que
  713.   valga 0) despues de cada error (siempre que no salgamos al DOS con cada
  714.   error).
  715.  
  716.        LA FUNCIαN "TRATAERROR"
  717.  
  718.     Para automatizar el proceso de tratamiento de errores existe una función
  719.   llamada `TrataError∩ que si hay error lo escribe en la pantalla y según
  720.   elijamos sale o no al DOS. Para decidir si sale o no al DOS se lo tenemos
  721.   que hacer saber cuando llamemos a la función `InicGRAPH∩ o `ResetGRAPH∩.
  722.     La función `TrataError∩ ha de aparecer seguidamente de la función que
  723.   queremos saber si ha producido un error y si no es así puede dar resultados
  724.   extraños. Quedan más cosas por decir del subsistema de tratamiento de erro-
  725.   res, pero no se me ocurren ahora :-O $$
  726. %%308
  727.     I'm sorry :-( Information not available in english.
  728.     Write me a post card to receive some help. Thank you :-)$$
  729. %%109
  730.        CONSIDERACIONS ENTRE LLENGUATGES
  731.  
  732.     GRAPH en la nova versió (la 2.0) soporta, a més a més de l'ensamblador,
  733.   alguns altres llenguatges. Per imposibilitats tècniques i físiques no tots
  734.   els compiladors soporten GRAPH. Així, per exemple, en el llenguatge C,
  735.   GRAPH ha estat disenyada mirart el Turbo C++ v2.0 i no cap altre. Per aixó,
  736.   pot ser que en el teu compilador, ja siga Watcom, Borland C o qualssevol
  737.   altre, GRAPH no funcione.
  738.     En aquestos casos sería una llastima no poder emprar GRAPH. La solució
  739.   que es podría prendre sería, seguit el exemple de C, modificar el fitxer
  740.   GRFLIB.H (o el corresponent al llenguatge emprat) per a fer-lo compatible
  741.   amb el teu compilador. Aquesta és la raó per la que GRAPH està estructurat
  742.   com ho està.
  743.  
  744.        VERSIO ENSAMBLADOR
  745.  
  746.     GRAPH v2.0 ja no es dedica exclusivament a l'assembler :-( però aquest
  747.   continua sent el llenguatge en el que es programa completament la biblio-
  748.   teca i en el que inicialment es pensa. Per aixó, des de l'ensamblador es
  749.   podrà controlar tot tal i com va ser pensat (també per que l'ensamblador
  750.   és un llenguatge més potent).
  751.     En la versió en assembler ens trobem amb dos possibilitats: la de cri-
  752.   dades "far" i la de cridades "near". Les dos es troben en directoris di-
  753.   ferents i són fàcilment localizables. Una volta hem decidit com cridem a
  754.   les funcions de GRAPH, hem de decidir la forma de les cridades: mitjan-
  755.   çant macros (alternativa 1) o mitjançant CALLs (alternativa 2). Aquestes
  756.   dos formes de comunicació amb GRAPH tenen, com tot, les seves ventajes i
  757.   els seus inconvenients. Amb CALLs alhora de "debuggejar", tot serà més
  758.   clar, però serà un poquet més lent. Al ser menys clar amb macros, jo re-
  759.   comane fer-ho primer amb CALLs i, una volta acabat, passar-ho a macros.
  760.   Per a escollir l'alternativa 1 s'haura de incloure el fitxer GRFLIB.INC
  761.   al fitxer .ASM i per a l'alternativa 2 s'inclourà el fitxer GRFLIB2.INC.
  762.  
  763.        VERSIO C
  764.  
  765.     Encara que no és la primera versió de GRAPH que soporta C (la versió 1.3
  766.   ja el soportava), si és la primera que es troba disponible al públic. GRAPH
  767.   s'aprofita d'aquest llenguatge de mig nivell completament (excepte per dos
  768.   funcions que es troben deshabilitades en el fitxer d'inclusió GRFLIB.H).
  769.     La consideració més important que s'ha de fer es que dins el fitxer ano-
  770.   menat GRFLIB.H hi han dues funcions `PideMEM∩ i `LiberaMEM∩ que són les
  771.   que, internament, GRAPH crida per a demanar memoria. Si no es coneix a la
  772.   perfecció GRAPH, el millor seria deixar-les tal i com són per a no pejar
  773.   el PC.
  774.     Existeixen en C un parell de possibilitats d'ús que es corresponen amb
  775.   el criteri de cridada "far" y el "near". El "far" ens permetrà fer progra-
  776.   mes en el model de memoria "large", mentre el "near" ens ho permetrè en
  777.   el model "compact". La resta de models no poden ser emprats per GRAPH sense
  778.   alguna modificació dels fitxers d'inclusió corresponents.
  779.     Si disposes d'un compilador distint o vols programar amb un altre model
  780.   de memoria, intenta modificar els fitxers d'inclusió i si aconseguises
  781.   fer-lo funcionar correctament enviame'l i seràs col·laborador de GRAPH
  782.   (mira la secció corresponent).
  783.  
  784.        VERSIO PASCAL
  785.  
  786.     GRAPH fa servir en la implementació de Pascal (Turbo Pascal 6.0 per ser
  787.   exactes) tota la potencia de GRAPH a excepció de les dues funcions ya
  788.   esmentades en C que he inhabilitat. Per a incluir GRAPH en els teus pro-
  789.   grames en Pascal hauras de ficar en la clausula "USES" una referència a
  790.   la llibreria que en aquest cas serà `GRFLIB.TPU∩. Aquesta TPU inclou en
  791.   sí mateixa el modul .OBJ que també podràs trobar per separat per si vols
  792.   recompilar la unit de GRAPH.
  793.     En la versió Pascal només et caldrà tenir en compte que no podrás inha-
  794.   bilitar les cridades far (amb la directiva {$F-}) durant el transcurs del
  795.   teu programa. No serà necessaria cap elecció com en el cas del C o l'en-
  796.   samblador. Hauras de tenir present la forma distinta que té Pascal de trac-
  797.   tar les cadenes respecte al C, per el que, al acabar qualsevol cadena
  798.   deuries de col·locar sempre un carácter 0 (amb "+chr(0)").
  799.     El sistema que s'ha seguit per a fer les cridades a GRAPH des del mòdul
  800.   TPU es força interessant, encara que podría resultar un pel complicat de
  801.   modificar. Llig el darrer paràgraf de la versió en C que també serveix per
  802.   al Pascal i l'assembler.$$
  803. %%209
  804.        CONSIDERACIONES ENTRE LENGUAJES
  805.  
  806.     GRAPH en la nueva versión soporta, además del ensamblador, algunos otros
  807.   lenguajes. Por imposibilidades técnicas y físicas no todos los compiladores
  808.   soportan GRAPH. Así, por ejemplo, en el lenguaje C, GRAPH ha sido diseñada
  809.   para el Turbo C++ v2.0 y no otro. Por eso, puede ser que en tu compilador,
  810.   ya sea Watcom, Borland C o cualquier otro, GRAPH no funcione.
  811.     En estos casos sería una lástima no poder usar GRAPH. La solución que se
  812.   podría tomar sería, siguiendo el ejemplo de C, modificar el fichero GRFLIB.H
  813.   (o el correspondiente al lenguaje empleado) para hacerlo compatible con tu
  814.   compilador. Esta es la razón por la que GRAPH está estructurado como lo
  815.   está.
  816.  
  817.        VERSION ENSAMBLADOR
  818.  
  819.     GRAPH v2.0 ya no se dedica exclusivamente al assembler, pero éste conti-
  820.   nua siendo el lenguaje con el que está programada la biblioteca i en el que
  821.   se piensa inicialmente. Por eso, desde el ensamblador se podrá controlar
  822.   todo tal i como fue pensado.
  823.     En la versión en assembler nos encontramos con dos posibilidades: la de
  824.   llamadas "far" y la de llamadas "near". Una vez hemos decidido como llamar
  825.   a las funciones de GRAPH, tenemos que decidir la forma de las llamadas:
  826.   mediante MACROS (alternativa 1) o mediante CALLs (alternativa 2). Estas 2
  827.   formas de comunicación con GRAPH tienen sus ventajas y sus inconvenientes.
  828.   Con CALLs cuando hay que debuggear, todo será más claro, pero será un poco
  829.   más lento. Yo recomiendo hacerlo primero con CALLs y, una vez acabado, pa-
  830.   sarlo a MACROS. Para escojer la alternativa 1 se tendrá que incluir el fi-
  831.   chero GRFLIB.INC y para la 2 el fichero GRFLIB2.INC.
  832.  
  833.        VERSION C
  834.  
  835.     Aunque no es la primera versión de GRAPH que soporta C (la versión 1.3
  836.   ya lo soportaba), sí es la primera que se encuentra disponible al público.
  837.   GRAPH se aprovecha de este lenguaje de medio nivel completamente (excepto
  838.   por dos funciones que se encuentran deshabilitadas en el fichero de inclu-
  839.   sión GRFLIB.H).
  840.     La consideración más importante que se ha de hacer es que dentro del fi-
  841.   chero llamado GRFLIB.H hay dos funciones `PideMEM∩ y `LiberaMEM∩ que son las
  842.   que, internamente, GRAPH llama para pedir memoria. Si no se conoce a la
  843.   perfección GRAPH, lo mejor seria dejarlas tal y como estan para no colgar
  844.   el PC.
  845.     Existen en C un par de posibilidades de uso que se corresponden con
  846.   el criterio de llamada "far" y el "near". El "far" nos permitirá hacer
  847.   programas en el modelo de memoria "large", mientras el "near" nos lo permi-
  848.   tirá en el modelo "compact". El resto de modelos no pueden ser usados por
  849.   GRAPH sin alguna modificación de los ficheros de inclusión correspondientes.
  850.     Si dispones de un compilador distinto o quieres programar con otro modelo
  851.   de memoria, intenta modificar los ficheros de inclusión y si lo consigues
  852.   hacer funcionar correctamente enviamelo y serás colaborador de GRAPH (mira
  853.   la sección correspondiente).
  854.  
  855.        VERSION PASCAL
  856.  
  857.     GRAPH obtiene en la implementación de Pascal (Turbo Pascal 6.0 para ser
  858.   exactos) toda la potencia de GRAPH a excepción de las dos funciones ya
  859.   comentadas en C que he inhabilitado. Para incluir GRAPH en tus programas
  860.   en Pascal tendrás que poner en la clausula "USES" una referéncia a la libre-
  861.   ria que en este caso será `GRFLIB.TPU∩. Esta TPU incluye en sí misma el
  862.   modulo .OBJ que tambien podrás encontrar por separado por si quieres
  863.   recompilar la unit de GRAPH.
  864.     En la versión Pascal sólo te hará falta tener en cuenta que no podrás
  865.   inhabilitar las llamadas "far" (con la directiva {$F-}) durante el trans-
  866.   curso de tu programa. No será necesaria ninguna elección como en el caso de
  867.   C o el ensamblador. Tendrás que tener presente la forma distinta que tiene
  868.   Pascal de tratar las cadenas respecto al C, por lo que, al acabar cualquier
  869.   cadena deberias de colocar siempre un carácter 0 (con "+chr(0)").
  870.     El sistema que se ha seguido para hacer las llamadas a GRAPH desde el mó-
  871.   dulo TPU es bastante interesante, aunque podría resultar un poco complicado
  872.   de modificar. Lee el último párrafo de la versión C que tambien sirve para
  873.   el Pascal y el assembler.$$
  874. %%309
  875.     I'm sorry :-( Information not available in english.
  876.     Write me a post card to receive some help. Thank you :-)$$
  877. %%110
  878.        DOBLAR LES LINIES
  879.  
  880.     De vegades ens caldrà tenir més linies en pantalla de les que tenim i
  881.   ara amb GRAPH podrem fer-ho. Per a començar necessitem estar en un mode
  882.   planar (2 o 3). El que farem será juntar les planes gràfiques 1 i 2 en
  883.   una sola representació. Per consegüent, en el mode 2 ens quedarem en sols
  884.   2 planes gràfiques i 1.5 (encara que sols podrem veure una) en mode 3.
  885.   Per a fer-ho simplement cridarem a la funció `DoblaLineas∩.
  886.     Sencill veritat? Doncs una volta has entrat, tot el que resta es pot
  887.   fer sense canviar ni una sola linia del teu programa respecte a la versió
  888.   sense doblar linies, es a dir, un `PonPixel∩ "reconeix" el mode en el que
  889.   ens trobem i actua en conseqüencia.
  890.     A voltes ens caldrà tornar al mode anterior (amb les linies sense
  891.   doblar), aleshores simplement haurem de cridar a la funció `ResetGRAPH∩
  892.   i tornarem. De vegades, però, haurem de fer el pas contrari, es a dir,
  893.   en compte de 200 línies voldrem 100 (o de 240 a 120). Per a aquest cas
  894.   prescindirem de GRAPH i farem el que s'explica en el exemple de Pascal.
  895.  
  896.        SCROLL ASSISTIT PER HARDWARE
  897.  
  898.     Aquest truc també és sols per als modes planars i en ell aconseguirem
  899.   un scroll del tipus "gràfic gegant". El hardware de video (de la tarjeta
  900.   VGA es suposa) ens ajudarà a aconseguir-ho.
  901.     Les funcions de GRAPH relacionades són `SetVSPixels∩ i `SetStart∩. Per
  902.   a començar cridarem a `SetVSPixels∩ per a dir-li cuants pixels formen una
  903.   línia interna. Aquest concepte de línia interna tal volta et resulte un
  904.   poc confús però, en realitat, és molt simple. Es tracta de que el hardware
  905.   de la VGA el que fa és tenir virtualment una gran image composada per les
  906.   4 (o 3) planes gràfiques existents i el que fa en tot moment és mostrar
  907.   un tros d'aquest gran gràfic. Imaginem, per exemple, que aquest cuadre es
  908.                          es tota la memoria VRAM. En cada moment nosaltres
  909.  ┌─────────┬─────────┐   sols podem visualitzar una de les cuatre parts
  910.  │ 1       │ 2       │   (cada plana gràfica). La VGA ens permet canviar
  911.  │         │         │   l'inici on comença la plana gràfica (amb la funció
  912.  ├─────────┼─────────┤   `SetStart∩) i així serà com ens mourem. Però abans
  913.  │ 3       │ 4       │   haurem d'escollir el tipus de ordenació que volem.
  914.  │         │         │   En l'exemple de l'esquerra, s'ha "ordenat" a la VGA
  915.  └─────────┴─────────┘   que col·loque 640 pixels per línea.  Tenint en
  916.                          compte que açó és un mode planar hem de dividir
  917.   entre 4 aquesta cifra i el resultat és 160. I ja està es crida a la funció
  918.   amb la cifra aquesta dividida entre 2 (es a dir, amb un 80).
  919.     A partir del exposat ahí dalt podem deduir que per a col·locar les planes
  920.   una damunt de l'altra (per a scrolls verticals) hem de passar el nombre 40
  921.   i per a col·locar-les una al costat de l'altra (scroll horizontal) hem de
  922.   passar-li un 160.
  923.     El següent pas és fer l'scroll. Per uns raonaments anàlegs, podem deduir
  924.   les "complicadísimes" fórmules de moviment en l'scroll:
  925.  
  926.         SCROLL_dreta    --> Direcció_inici = Direcció_inici + 1
  927.         SCROLL_esquerra --> Direcció_inici = Direcció_inici - 1
  928.         SCROLL_avall    --> Direcció_inici = Direcció_inici + Long_linia
  929.         SCROLL_amunt    --> Direcció_inici = Direcció_inici - Long_linia
  930.  
  931.   La direcció d'inici haurà de ser el programa principal el que la guarde i
  932.   haurà d'inicialitzar-la el mateix programa (amb la funció `SetStart∩).
  933.  
  934.        SCROLL ASSISTIT PER BALDOSES
  935.  
  936.     El conjunt de funcions enmarcades per la designació de funcions de blocs
  937.   son les relacionades amb aquest tipus d'scroll (per baldoses o per blocs).
  938.   Mira bé que significa cada funció i fes proves amb elles. Les utilitats
  939.   adicionals t'ajudarán a crear blocs i mapes d'aquestos blocs. Molt jocs
  940.   empren aquest tipus d'scroll. Alguns exemples són tots els de plataformes,
  941.   els tipus Civilization (per cert, que joc més bo!), etc.$$
  942. %%210
  943.        DOBLAR LAS LINEAS
  944.  
  945.     A veces nos hará falta tener más líneas en pantalla de las que tenemos y
  946.   ahora con GRAPH podremos conseguirlas. Para empezar necesitamos estar en
  947.   un modo planar (2 o 3). Lo que haremos será unir las páginas gráficas 1 y 2
  948.   en una sola. Por consiguiente, en el modo 2 nos quedaremos con sólo 2 pági-
  949.   nas y en el modo 3 con 1.5 (aunque sólo podamos ver 1). Para hacerlo sim-
  950.   plemente llamaremos a la función `DoblaLineas∩.
  951.     Sencillo verdad? Pues una vez has entrado, todo lo que resta se puede
  952.   hacer sin cambiar ni una sola línea de teu programa respecto a la versión
  953.   sin doblar líneas, es decir, un `PonPixel∩ "reconoce" el modo en el que
  954.   nos encontramos y actua en conseqüencia.
  955.     A veces nos hará falta volver al modo anterior (con las líneas sin
  956.   doblar), entonces simplemente tendremos que llamar a la función `ResetGRAPH∩
  957.   y volveremos. Pero a veces tendremos que hacer el paso contrario, es decir,
  958.   en lugar de 200 líneas querremos 100 (o de 240 a 120). Para este caso pres-
  959.   cindiremos de GRAPH y haremos lo que se explica en el ejemplo de Pascal.
  960.  
  961.        SCROLL ASISTIDO POR HARDWARE
  962.  
  963.     Este truco tambien es solo para los modos planares y en él conseguiremos
  964.   un scroll del tipo "gráfic gigante". El hardware de video (de la tarjeta
  965.   VGA se supone) nos ayudará a aconseguirlo.
  966.     Las funciones de GRAPH relacionadas son `SetVSPixels∩ y `SetStart∩. Para
  967.   empezar llamaremos a `SetVSPixels∩ para decirle cuantos pixels forman una
  968.   línea interna. Este concepto de línea interna tal vez te resulte un poco
  969.   confuso pero, en realidad, es muy simple. Se trata de que el hardware de la
  970.   VGA lo que hace es tener virtualmente una gran imagen compuesta por las
  971.   4 (o 3) páginas gráficas existentes y lo que hace en todo momento es mostrar
  972.   un trozo de este gran gráfico. Imaginemos, por ejemplo, que este cuadro
  973.                          es toda la memoria VRAM. En cada momento nosaltros
  974.  ┌─────────┬─────────┐   solo podemos visualizar una de las cuatro partes
  975.  │ 1       │ 2       │   (cada página gráfica). La VGA nos permite cambiar
  976.  │         │         │   el inicio donde comienza la página gráfica (con la
  977.  ├─────────┼─────────┤   función `SetStart∩) y así será como nos moveremos.
  978.  │ 3       │ 4       │   Pero antes tendremos que escoger el tipo de ordena-
  979.  │         │         │   ción que queremos. En el ejemplo de la izquierda, se
  980.  └─────────┴─────────┘   ha ordenado a la VGA que coloque 640 pixels por
  981.                          línea. Teniendo en cuenta que esto es un modo planar
  982.   tenemos que dividir entre 4 esta cifra y el resultado es 160. Y ya está, se
  983.   llama a la función con la cifra ésta dividida entre 2 (es decir, con un 80).
  984.     A partir de lo expuesto ahí arriba podemos deducir que para colocar las
  985.   páginas una encima de otra (para scrolls verticales) tenemos que pasar el
  986.   número 40 y para colocarlas una al lado de la otra (scroll horizontal) hemos
  987.   de pasarle un 160.
  988.     El siguiente paso es hacer el scroll. Por unos razonamientos análogos,
  989.   podemos deducir las "complicadísimas" fórmulas de movimento en el scroll:
  990.  
  991.         SCROLL_derecha   --> Dirección_inicio = Dirección_inicio + 1
  992.         SCROLL_izquierda --> Dirección_inicio = Dirección_inicio - 1
  993.         SCROLL_abajo     --> Dirección_inicio = Dirección_inicio + Long_linea
  994.         SCROLL_arriba    --> Dirección_inicio = Dirección_inicio - Long_linea
  995.  
  996.   La dirección de inicio tendrá que ser el programa principal el que la guarde
  997.   y tendrá que inicializarla el mismo programa (con la función `SetStart∩).
  998.  
  999.        SCROLL ASISTIDO POR BALDOSAS
  1000.  
  1001.     El conjunto de funciones enmarcadas por la designación de funciones de
  1002.   bloques son las relacionadas con este tipo de scroll (por baldosas o por
  1003.   bloques). Mira bién que significa cada función y haz pruebas con ellas. Las
  1004.   utilitades adicionales te ayudarán a crear bloques y mapas de estos bloques.
  1005.   Muchos juegos utilizan este tipo de scroll. Algunos ejemplos son todos los
  1006.   de plataformas, los de tipo Civilization (por cierto,¡que juego más bueno!),
  1007.   etc.$$
  1008. %%310
  1009.     I'm sorry :-( Information not available in english.
  1010.     Write me a post card to receive some help. Thank you :-)$$
  1011. %%111
  1012.        ELS MODULS
  1013.  
  1014.     Els móduls són unes biblioteques d'ampliacions de funcions o de substi-
  1015.   tució per altres més poderoses o més rápides. Així, la informació que al
  1016.   programador-usuari interesa és simplement saber que existeixen ja que,
  1017.   alhora d'emprar-les, podrà saber tot el que li interesa mitjançant el DOC
  1018.   que incorporarà aquesta llibreria.
  1019.     Qui vulga fer moduls distribuibles per a GRAPH que mire la secció sobre
  1020.   col·laboradors i, per suposat, que continue llegint. Anem a veure, els
  1021.   móduls de GRAPH poden dividir-se en 2 tipus els de ampliació i els de
  1022.   actualització. Els d'actualització són aquells que permeten canviar alguna
  1023.   funció de GRAPH i els d'ampliació són els que augmenten el nombre de fun-
  1024.   cions (també poden donar-se móduls mixtes). Els móduls més complicades de
  1025.   programar són les del tipus d'ampliació ja que serà necessari coneixer
  1026.   molt bé i internament GRAPH i per aixó si t'animes a programar un módul
  1027.   així el millor és que m'escrigues una carta contant-me la teua idea i jo
  1028.   et proporcionaré tota la informació que et faça falta.
  1029.     Per a programar un módul haurás de tenir present la filosofia de GRAPH
  1030.   i respetar-la. També haurás de matindré el módul gratuit a tots els
  1031.   usuaris registrats anteriorment a la publicació del teu módul.$$
  1032. %%211
  1033.        LOS MODULOS
  1034.  
  1035.     Los módulos son unas bibliotecas de ampliación de funciones o de subs-
  1036.   titución por otras más poderosas o más rápidas. Así, la información que al
  1037.   programador-usuario le interesa es simplemente saber que le existen ya que,
  1038.   cuando vaya a usarlas, podrá saber todo lo que le interesa mediante el DOC
  1039.   que incorporará esta libreria.
  1040.     Quien hacer modulos distribuibles para GRAPH que mire la sección sobre
  1041.   colaboradores y, por supuesto, que continue leyendo ésta. Vamos a ver, los
  1042.   módulos de GRAPH pueden dividirse en 2 tipos los de ampliación y los de
  1043.   actualización. Los de actualización son aquellos que permiten cambiar alguna
  1044.   función de GRAPH y los de ampliación son los que aumentan el número de fun-
  1045.   ciones (tambien pueden darse módulos mixtos). Los módulos más complicados
  1046.   de programar son los del tipo de ampliación ya que será necesario conocer
  1047.   muy bien e internamente GRAPH y por eso, si te animas a programar un módulo
  1048.   así, lo mejor es que me escribas una carta contandome tu idea y yo te pro-
  1049.   porcionaré toda la información que te haga falta.
  1050.     Para programar un módulo tendrás que tener presente la filosofía de GRAPH
  1051.   y respetarla. Tambien tendrás que matener el módulo gratuito a todos los
  1052.   usuarios registrados anteriorment a la publicación de tu módulo.$$
  1053. %%311
  1054.     I'm sorry :-( Information not available in english.
  1055.     Write me a post card to receive some help. Thank you :-)$$
  1056. %%112
  1057.        COL·LABORADORS
  1058.  
  1059.     Tothom pot ser col·laborador de GRAPH, sols és necessari estar registrat
  1060.   i voler millorar alguna coseta de GRAPH. No sols és necessari fer col·labo-
  1061.   racions relacionades amb la programació, es pot col·laborar de moltes mane-
  1062.   res, tantes com se t'ocurreixen.
  1063.     La forma més immediata de col·laborar és crear un módul (llig la secció
  1064.   corresponent) o programant una utilitat adicional per a automatitzar alguna
  1065.   feina. Altra forma de col·laborar programant és millorant els programes
  1066.   que van acompanyant a GRAPH (i que tenen les seues fonts).
  1067.     Però tal volta vols col·laborar sense tocar l'ensamblador ni els compila-
  1068.   dors. En aquest cas pots col·laborar, per exemple, traduint GRAPH a la teua
  1069.   llengua (i jo t'enviaria els fonts d'aquest "Help"), donant sugerencies o
  1070.   simplement distribuint-lo per la teua ciutat o en la teua BBS local.
  1071.     Però no has de limitar-te a aquestes maneres de col·laborar, pots inven-
  1072.   tar-te d'altres noves. De totes maneres, si et decideixes a col·laborar,
  1073.   tin en compte que has de estar registrat i has de mantenir als usuaris
  1074.   registrats que hi haveren fins aleshores.$$
  1075. %%212
  1076.        COLABORADORES
  1077.  
  1078.     Todos pueden ser colaboradores de GRAPH, solo es necesario estar regis-
  1079.   trado y querer mejorar alguna cosita de GRAPH. No solo es necesario hacer
  1080.   colaboraciones relacionadas con la programación, se puede colaborar de
  1081.   muchas maneras, tantas como se te ocurran.
  1082.     La forma más inmediata de colaborar es crear un módulo (lee la sección
  1083.   correspondiente) o programado una utilidad adicional para automatizar alguna
  1084.   tarea. Otra forma de colaborar programando es mejorando los programas que
  1085.   van acompañando a GRAPH (y que tienen sus códigos fuentes).
  1086.     Pero tal vez quieres colaborar sin tocar el ensamblador ni los compila-
  1087.   dores. En este caso puedes colaborar, por ejemplo, traduciendo GRAPH a tu
  1088.   lengua (y yo te enviaria los códigos fuentes de este "Help"), dando suge-
  1089.   réncias o simplemente distribuyendolo por tu ciudad o en tu BBS local.
  1090.     Pero no has de limitarte a estas maneres de colaborar, puedes inventarte
  1091.   otras nuevas. De todas formas, si te decides a colaborar, ten en cuenta que
  1092.   has de estar registrado y has de mantener a los usuarios registrados que
  1093.   hayan hasta entonces.$$
  1094. %%312
  1095.     I'm sorry :-( Information not available in english.
  1096.     Write me a post card to receive some help. Thank you :-)$$
  1097. %%113
  1098.        SUBSCRIPCIONS I REGISTRES
  1099.  
  1100.     Legalment no vas a ser perseguit per emprar GRAPH sense estar registrat,
  1101.   però sí moralment :-) Per que tal volta, un día, GRAPH es faça shareware i
  1102.   siga necessari estar registrat per a poder beneficiar-se de les seues ven-
  1103.   tajes, aleshores pensaràs "Com he estat tan tonto de no subscriurem?".
  1104.     Les ventajes dels usuaris registrats són realment grans, com per exemple:
  1105.  
  1106.   - Tenir dret a que totes les versions posteriors de GRAPH li surten gràtis.
  1107.   - Tenir dret a fer preguntes.
  1108.   - Poder ser col·laborador.
  1109.   - Tenir informació de cuan surten noves versions i móduls.
  1110.   - Poder tenir gràtis els nous móduls que es creen.
  1111.   - Poder ser subscriptor.
  1112.   - Etc.
  1113.  
  1114.   Com podrás veure hi ha més d'una raó per a ser usuari registrat i tot pel
  1115.   preu d'una postal i un segell.
  1116.     D'altra banda, el subscriptor és un usuari registrat normal que cada
  1117.   volta que surt una nova versió de GRAPH o un nou módul se li envia aquesta
  1118.   versió o aquest módul (en la carta de subscripció es pot especificar si
  1119.   es vol o no que se envien els móduls o les noves versions). Simplement el
  1120.   que s'ha de fer és enviar-me la postal per a registrar-se i després una
  1121.   carta on em diga que vol ser subscriptor (per aquesta vegada acceptaré que
  1122.   s'envie la postal dins de la carta). Dins del sobre s'haura d'incloure una
  1123.   determinada cuantitat de diskettes. Aquesta cuantitat serà la de noves ver-
  1124.   sions que ens subscriurem més una i aquestos diskettes hauran de estar
  1125.   plens de coses interesants (mirar el cuadre per a veure sugerències). Si,
  1126.   per exemple, ens volem subscriure per a les pròximes 4 versions de GRAPH,
  1127.   però no a les versions intermitjes (o siga a les versions 3.0, 4.0, 5.0 i
  1128.   6.0), enviarem una carta especificant que no volem les versions intermitjes
  1129.   ni els móduls i enviarem també 5 diskettes (4 per a enviar les versions de
  1130.   GRAPH i un per a gastos de lliurament).
  1131.  
  1132.  ┌─────────────[ Sugerencies de contingut ]───────────────┐
  1133.  │                                                        │
  1134.  │  æ Diskettes plens de virus informàtics o informació   │
  1135.  │    sobre ells.                                         │
  1136.  │  æ Les fonts d'algun(s) joc(s) o demo(s) interesant(s).│
  1137.  │  æ Un compilador de LISP en DOS u OS/2.                │
  1138.  │  æ Un compilador de ADA 95 més rápid que el de GNU.    │
  1139.  │  æ Arxius del tipus FAQs o TXT que expliquen coses     │
  1140.  │    interesants sobre programació.                      │
  1141.  │  æ Un ensamblador en DOS compatible amb el TASM i el   │
  1142.  │    MASM que soporte multiples passades.                │
  1143.  │  æ Llibres o revistes electróniques.                   │
  1144.  │                                                        │
  1145.  └────────────────────────────────────────────────────────┘$$
  1146. %%213
  1147.        SUBSCRIPCIONES Y REGISTROS
  1148.  
  1149.     Legalmente no vas a ser perseguido por usar GRAPH sin estar registrado,
  1150.   pero sí moralment :-) Porque tal vez, un día, GRAPH se haga shareware y sea
  1151.   necesario estar registrado para poder beneficiarse de sus ventajas, entonces
  1152.   pensarás "Como he estado tan tonto de no subscribirme?".
  1153.     Las ventajas de los usuarios registrados son realmente grandes, como por
  1154.   ejemplo:
  1155.  
  1156.   - Tener derecho a que todas las versiones posteriores de GRAPH le salgan
  1157.     grátis.
  1158.   - Tener derecho a hacer preguntas sobre GRAPH.
  1159.   - Poder ser colaborador.
  1160.   - Tener información de cuando salen nuevas versiones y modulos.
  1161.   - Poder tener grátis los nuevos módulos que se creen.
  1162.   - Poder ser subscriptor.
  1163.   - Etc.
  1164.  
  1165.   Como podrás ver hay más de una razón para ser usuario registrado y todo por
  1166.   el precio de una postal y un sello.
  1167.     Por otro lugar, el subscriptor es un usuario registrado normal que cada
  1168.   vez que sale una nueva versión de GRAPH o un nuevo módulo se le envia esta
  1169.   versión o este módulo (en la carta de subscripción se puede especificar si
  1170.   se quiere o no que se envien los módulos o las nuevas versiones). Simple-
  1171.   mente lo que se ha de hacer es enviarme la postal para registrarse y despues
  1172.   una carta donde me diga que quiere ser subscriptor (por esta vez aceptaré
  1173.   que se envie la postal dentro de la carta). Dentro del sobre se tendrá que
  1174.   incluir una determinada cantidad de diskettes. Esta cantidad será la de
  1175.   nuevas versiones a las que nos subscribiremos más una y estos diskettes
  1176.   tendrán que estar llenos de cosas interesantes (mirar el cuadro para ver
  1177.   sugeréncias). Si, por ejemplo, nos queremos subscribir para las próximas 4
  1178.   versiones de GRAPH, pero no a les versiones intermedias (o sea a las ver-
  1179.   siones 3.0, 4.0, 5.0 i 6.0), enviaremos una carta especificando que no
  1180.   queremos las versions intermedias ni los módulos y enviaremos tambien 5
  1181.   diskettes (4 para enviar les versiones de GRAPH y uno para gastos de envio).
  1182.  
  1183.  ┌─────────────[ Sugeréncias de contenido ]───────────────┐
  1184.  │                                                        │
  1185.  │  æ Diskettes llenos de virus informáticos o información│
  1186.  │    sobre ellos.                                        │
  1187.  │  æ Los códigos fuente de algun(os) juego(s) o demo(s)  │
  1188.  │    interesante(s).                                     │
  1189.  │  æ Un compilador de LISP en DOS u OS/2.                │
  1190.  │  æ Un compilador de ADA 95 más rápido que el de GNU.   │
  1191.  │  æ Archivos del tipo FAQs o TXT que expliquen cosas    │
  1192.  │    interesantes sobre programación.                    │
  1193.  │  æ Un ensamblador en DOS compatible con el TASM y el   │
  1194.  │    MASM que soporte multiples pasadas.                 │
  1195.  │  æ Libros o revistas electrónicas.                     │
  1196.  │                                                        │
  1197.  └────────────────────────────────────────────────────────┘$$
  1198. %%313
  1199.     I'm sorry :-( Information not all available in english.
  1200.     Write me a post card to receive more help. Thank you :-)
  1201.  
  1202.     To be a registered user, you have to send me a post card.
  1203.     GRAPH is card-ware and this is a full version. If you want to
  1204.     receive in your house all versions of GRAPH, send me the post
  1205.     card and explain me it. Try to read the spanish or the català
  1206.     version.$$
  1207. %%114
  1208.        PREGUNTES I RESPOSTES SOBRE GRAPH
  1209.  
  1210.  P: Cada cuan surt una nova versió de GRAPH?
  1211.  R: Les noves versions i sub-versions de GRAPH no tenen una data de surtida,
  1212.     surten cuan estan llestes per a surtir. Aproximadament es podría dir que
  1213.     surt una nova versió cada any i les sub-versions, normalment, la x.1 i la
  1214.     x.2, que són versions corregides de la x.0, solen surtir 1 mes o 2 més
  1215.     tard.
  1216.  
  1217.  P: La versió 2.0 serà shareware?
  1218.  R: Evidentment t'hauras adonat de que NO, però podrien ser-ho versions
  1219.     posteriors.
  1220.  
  1221.  P: Perque GRAPH sols és per a programadors en assembler?
  1222.  R: En el moment en que programí la primera versió de GRAPH (i ara tambè) el
  1223.     llenguatge de programació que més m'agradava i més potencia era capaç de
  1224.     donar-me era l'ensamblador. Per aixó, jo sempre programava en assembler
  1225.     i m'oblidí un poc dels usuaris potencials que no coneixen aquest llen-
  1226.     guatge. Encara que sí que va existir una versió de GRAPH per a C abans
  1227.     de la versió 2.0
  1228.  
  1229.  P: On es poden aconseguir noves versions?
  1230.  R: Al mateix lloc d'on has pillat aquesta o subscribinte.
  1231.  
  1232.  P: Programes GRAPH tú sol?
  1233.  R: Sí, per ara no he rebut cap ajuda. Per aixó GRAPH no té dates de surtida,
  1234.     no sé si tindre temps per a programar una nova funció ara o si haure
  1235.     d'esperar-me una semana per a fer-ho. Ara pot canviar açó per que he
  1236.     donat l'oportunitat a tots els usuaris registrats de ser col·laboradors.
  1237.  
  1238.  P: Per a qué serveix la postal que demanes per registrar-se?
  1239.  R: Doncs és un forma de pagament simbòlic que a més a més es gratificant
  1240.     (de vegades) per a la vista.$$
  1241. %%214
  1242.        PREGUNTAS Y RESPUESTAS SOBRE GRAPH
  1243.  
  1244.  P: ¿Cada cuanto sale una nueva versión de GRAPH?
  1245.  R: Les nuevas versiones y sub-versiones de GRAPH no tienen una fecha de
  1246.     salida, salen cuando estan listas para salir. Aproximadamente se podría
  1247.     decir que sale una nueva versión cada año y las sub-versiones, normal-
  1248.     mente, la x.1 y la x.2, que son versiones corregidas de la x.0, suelen
  1249.     salir 1 mes o 2 más tarde.
  1250.  
  1251.  P: ¿La versión 2.0 será shareware?
  1252.  R: Evidentmente te habras dado cuenta de que NO, pero podrian serlo versiones
  1253.     posteriores.
  1254.  
  1255.  P: ¿Porqué GRAPH solo es para programadores en assembler?
  1256.  R: En el momento en que programé la primera versión de GRAPH (y ahora tam-
  1257.     bien) el lenguaje de programación que más me gustaba y más potencia era
  1258.     capaz de darme era el ensamblador. Por eso, yo siempre programo en assem-
  1259.     bler y me olvidé un poco de los usuarios potenciales que no conocen este
  1260.     lenguaje. Aunque sí que existio una versión de GRAPH para C antes de la
  1261.     versión 2.0
  1262.  
  1263.  P: ¿Donde se pueden conseguir nuevas versiones?
  1264.  R: En el mismo sítio de donde has pillado esta o subscribiendote.
  1265.  
  1266.  P: ¿Programas GRAPH tu solo?
  1267.  R: Sí, por ahora no he recibido ninguna ayuda. Por eso GRAPH no tiene fechas
  1268.     de salida, no sé si tendre tiempo para programar una nueva función ahora
  1269.     o si tendre que esperarme una semana para hacerlo. Ahora puede cambiar
  1270.     esto porque he dado la oportunidad a todos los usuarios registrados de
  1271.     ser colaboradores.
  1272.  
  1273.  P: Para que sirve la postal que pides para registrarse?
  1274.  R: Pues es una forma de pago simbólico que a además es gratificante (a veces)
  1275.     para la vista.$$
  1276. %%314
  1277.     I'm sorry :-( Information not available in english.
  1278.     Write me a post card to receive some help. Thank you :-)$$
  1279. %%115
  1280.        PROGRAMACIO PRACTICA AMB GRAPH
  1281.  
  1282.     A continuació es presenta un exemple complet de programació amb GRAPH
  1283.   en cadascun del llenguatges que soporta GRAPH.
  1284.  
  1285.        PROGRAMACIO EN ASSEMBLER
  1286.  
  1287.     La programació en assembler, el llenguatge més potent dels existents, és
  1288.   un poc més dificil. La dificultat està, però, compensada i gràcies a aquest
  1289.   llenguatge aconseguirás fites inimaginables en el que respecta a velocitat
  1290.   i compactació. Al ser el llenguatge nadiu de GRAPH, l'acoplament és el més
  1291.   perfecte.
  1292.     Anem a fer un petit exemple de programació en assembler que consistirà en
  1293.   un scroll de text sense emprar el hardware (no molt recomanable cuan tingam
  1294.   la possibilitat d'ajudar-se del hardware). El primer serà escollir la forma
  1295.   i el tipus de cridades que farem a GRAPH. He escollit el model "near" i les
  1296.   macros perque es tracta d'un projecte petit i en el que necessitem la velo-
  1297.   citat màxima, respectivament.
  1298.     Primer haurem de col·locar tot aixó dels segments de dades i code, per a
  1299.   simplificar escolliré els que ens dóna el TASM per defecte:
  1300.  
  1301. .MODEL SMALL
  1302. .STACK
  1303. .386
  1304.  
  1305. .DATA
  1306. PVirt1  DB      0
  1307. hFont   DB      0
  1308. Msg1    DB      'Esto es una prueba de scroll',0
  1309.  
  1310. .CODE
  1311.  
  1312.   He col·locat unes dades en el segment corresponent que són respectivament
  1313.   per a un handle de PV (pantalla virtual), un handle de font i el mensatge
  1314.   de l'scroll.
  1315.     Seguidament col·locarem la capçalera que ens permet cridar a GRAPH des
  1316.   d'assembler i el procediment principal (i únic):
  1317.  
  1318. INCLUDE GRFLIB.INC
  1319.  
  1320. Inicio          PROC
  1321.  
  1322.   Dins d'aquest procediment col·locarem, primerament, una cridada per a
  1323.   liberar la memoria ocupada i l'inicialització de GRAPH i les dades del
  1324.   programa:
  1325.  
  1326.                 CALL    LiberaMEM       ;  Se libera la memoria.
  1327.                 MOV     BX, 1
  1328.                 MOV     EAX, 010b
  1329.                 InicGRAPH               ;  Encendemos GRAPH.
  1330.                 MOV     AX, @DATA
  1331.                 MOV     DS, AX
  1332.  
  1333.     Una volta fet açó ja podem cridar a qualssevol funció de GRAPH, ja estan
  1334.   totes disponibles. El següent per a fer el nostre scroll serà demanar una
  1335.   PV i inicialitzar el sub-sistema de fonts (demanant al DOS que ens deixe
  1336.   prestades les seues fonts):
  1337.  
  1338.                 CreaVirtual             ;  Pedimos una PV.
  1339.                 MOV     [PVirt1], AL
  1340.                 MOV     AL, 8
  1341.                 CambiaTipo              ;  Cambiamos el tipo de fuente.
  1342.                 CogeFuenteDOS           ;  Cogemos las fuentes del DOS.
  1343.                 MOV     [hFont], AL
  1344.  
  1345.     Una volta fet açó nomes ens queda fer l'scroll propiament dit:
  1346.  
  1347.                 MOV     DX, 205
  1348.           @@Bucle:
  1349.                 PUSH    DX
  1350.                 MOV     BX, 40
  1351.                 SetCursor               ;  Colocamos el cursor.
  1352.                 MOV     AL, [PVirt1]
  1353.                 MOV     CL, 0
  1354.                 BorraPantalla
  1355.                 MOV     BH, DL
  1356.                 MOV     SI, Offset Msg1
  1357.                 MOV     BL, [PVirt1]
  1358.                 MOV     AL, [hFont]
  1359.                 MOV     CL, 9
  1360.                 MOV     DL, 10
  1361.                 Escribe                 ;  Escribimos
  1362.                 WaitVR
  1363.                 MOV     AL, [PVirt1]
  1364.                 MOV     AH, 0           ;  La VGA
  1365.                 CopiaPantalla           ;  Dibujamos en la VGA.
  1366.                 POP     DX
  1367.                 DEC     DX
  1368.                 JNZ   @@Bucle           ;  Volvemos a repetir hasta 0.
  1369.  
  1370.   El primer que es fa és col·locar en DX el valor 205 que després es col·loca
  1371.   en la pila. Aquest valor ens indicarà la fila on es troba el text al que li
  1372.   estem fent l'scroll i ens servirà en la primera cridada a GRAPH per a dir
  1373.   on volem que es col·loque el cursor gràfic. Després plenarem amb el valor 0
  1374.   que es suposa que és negre la pantalla virtual que haviem demanat per a no
  1375.   deixar una estela al pasar el text per pantalla (proba de llevar la cridada
  1376.   a `BorraPantalla∩). El següent és escriure a pantalla el text i esperar a
  1377.   un retrazat vertical. Amb aquest retrazat (¡que mal sona!) evitem el efecte
  1378.   desagradable que pot apareixer. Darrerament copiem a la VGA i fem les opor-
  1379.   tunes comprobacions per veure si ja s'acabat l'scroll. Les línies següents
  1380.   s'encarreguen de finalitzar GRAPH i tornar al DOS:
  1381.  
  1382.                 VaciaMEM
  1383.                 EndGRAPH
  1384.                 MOV     AX, 4C00h
  1385.                 INT     21h             ;  Salimos al DOS.
  1386. Inicio          ENDP
  1387.                 END     Inicio
  1388.  
  1389.     Com podràs veure, pot resultar molt sencill programar amb GRAPH i per si
  1390.   encara vols més exemples, mira't l'altre exemple de programació amb GRAPH
  1391.   i recorda que per a compilar sols has d'escriure:
  1392.  
  1393.     TASM  mydemo.asm
  1394.     TLINK mydemo.obj graph.lib
  1395.  
  1396.  
  1397.        PROGRAMACIO EN LLENGUATGE C
  1398.  
  1399.     El exemple de C et demostrarà la potencia dels scrolls per baldoses. He
  1400.   escollit el model "far" així que haurás de compilar l'exemple en el model
  1401.   "large". En l'exemple obrirem uns fitxers de blocs i mapes i els visua-
  1402.   litzarem movent-nos aleatoriament per la pantalla fins a presionar una
  1403.   tecla. Primer es troben els fitxers d'inclusió entre els que està el de
  1404.   GRAPH en C:
  1405.  
  1406. #include <stdlib.h>
  1407. #include <conio.h>
  1408. #include "GRFLIB.H"
  1409.  
  1410. int main(void)
  1411. {
  1412.  
  1413.     Seguim inicialitzant les variables i el sistema GRAPH. Les variables que
  1414.   necessitem són les de handles de PV, mapa i blocs i les que guarden les
  1415.   coordenades de pantalla i els increments.
  1416.  
  1417.  byte hdlpv, hmap, hblk;
  1418.  int num, ix, iy;
  1419.  dword coorx,coory;
  1420.  
  1421.  InicGRAPH(1,0);
  1422.  TrataError();
  1423.  hdlpv=CreaVirtual();
  1424.  TrataError();
  1425.  hmap=CargaMapa("ejemplo.map");
  1426.  TrataError();
  1427.  hblk=CargaBloque("ejemplo.blk");
  1428.  TrataError();
  1429.  coorx=coory=0;
  1430.  
  1431.     Continuem amb un bucle "while" on es comproba si s'ha presionat una tecla
  1432.   i s'inicialitzen els increments:
  1433.  
  1434.  while(!kbhit())
  1435.   {
  1436.    num=random(100);
  1437.    ix=random(3)-1;
  1438.    iy=random(3)-1;
  1439.  
  1440.   Després hi ha un altre bucle "while" que ens servirà per a incrementar les
  1441.   posicions (comprobant que no ens passem massa) i dibuixar en la PV que
  1442.   haviem demanat el mapa de blocs. I a la fi copiem a la VGA el mapa que
  1443.   haviem creat internament.
  1444.  
  1445.    while(--num>0)
  1446.     {
  1447.      coorx+=ix;
  1448.      coory+=iy;
  1449.      if(coorx>10000) coorx=0;
  1450.      if(coory>10000) coory=0;
  1451.      DibujaMapa(hdlpv,hmap,hblk,coorx,coory);
  1452.      CopiaPantalla(hdlpv,0);
  1453.      }
  1454.    }
  1455.  
  1456.     Finalitzem GRAPH i tornem al DOS amb les següents línies:
  1457.  
  1458.  VaciaMEM();
  1459.  EndGRAPH();
  1460.  return 0;
  1461.  }
  1462.  
  1463.   És molt sencill programar en C amb GRAPH. Si vols veure més exemples en C
  1464.   t'hauras d'esperar a la pròxima versió o fer-los tu mateix (a programar en
  1465.   GRAPH sols s'apren programant ;-)
  1466.  
  1467.        PROGRAMACIO EN PASCAL
  1468.  
  1469.     L'exemple de Pascal ens mostrarà una rutina que és el principi de molts
  1470.   efectes de demos com el foc fractal, el blur, etc. També podrem veure amb
  1471.   aquest exemple un truc per a dividir les línies en pantalla.
  1472.     Per a començar ampliarem la memoria de pila fins al màxim i indicarem a
  1473.   Pascal que emprarem GRAPH mitjançant la TPU anomenada "grflib.tpu":
  1474.  
  1475. {$M 64000,0,655360}
  1476. PROGRAM ProbaDeGRAPHiPascal;
  1477.  
  1478. USES Crt, grflib;
  1479.  
  1480.     El següent és la initicialització de les constants i les variables. La
  1481.   constant "VGA" la emprarem després per a referir-nos a la pantalla física.
  1482.   Les variables de memoria magatzemaran els handles de paleta, font i PV.
  1483.   A més a més tenim unes variables auxiliars i un array de missatges i les
  1484.   variables que indicarán cuan mostrar un nou missatge i el color d'aquest:
  1485.  
  1486. CONST
  1487.    VGA  =  0;
  1488.  
  1489. VAR
  1490.   hfont,
  1491.   pv1      : Byte;
  1492.   i, j, s  : Integer;
  1493.   Msg      : Array [1..10] of String;
  1494.   Clock    : Integer;
  1495.   Col      : Byte;
  1496.  
  1497.     El següent bloc de codi és la inicialització de GRAPH i el truc per a
  1498.   dividir les línies en pantalla:
  1499.  
  1500. BEGIN
  1501.   InicGRAPH(1,0);
  1502.   ASM
  1503.     MOV dx,3d4h
  1504.     MOV al,9
  1505.     OUT dx,al
  1506.     INC dx
  1507.     IN  al,dx
  1508.     AND al,0e0h
  1509.     ADD al,3
  1510.     OUT dx,al
  1511.   END;
  1512.  
  1513.     Després apareix la part on es demana la PV i es carrega la paleta de
  1514.   colors. Observeu que borrem la VGA i la PV que hem demanat per que podrien
  1515.   contenir dades que no desitjem que apareguen. Observa també que cuan carre-
  1516.   guem la paleta no guardem el handle. Per tant no podrem lliberar la memoria
  1517.   emprada per la paleta fins a que no cridem a `VaciaMEM∩ o acabem el progra-
  1518.   ma. Per finalitzar en aquest bloc recorder-te que darrere de cada literal
  1519.   cuan programes en PASCAL haurás d'insertar un caracter 0.
  1520.  
  1521.   pv1:=CreaVirtual;
  1522.   BorraPantalla(0, pv1);
  1523.   BorraPantalla(0, VGA);
  1524.   CambiaTipo(8);
  1525.   hfont:=CogeFuenteDOS;
  1526.   PonPaleta(CargaPaleta('paleta.col'+chr(0)), 0, 0);
  1527.  
  1528.   Msg[1] := '    Hola a tots, açó és Pascal + GRAPH'+chr(0);
  1529.   Msg[2] := '   Hola a todos, esto es Pascal + GRAPH'+chr(0);
  1530.   Msg[3] := '  Hello everyone, this is Pascal + GRAPH'+chr(0);
  1531.   Msg[4] := '=========================================='+chr(0);
  1532.   Msg[5] := '------------------------------------------'+chr(0);
  1533.   Msg[6] := '__________________________________________'+chr(0);
  1534.   Msg[7] := '..........................................'+chr(0);
  1535.  
  1536.   s:=1; clock:=100;
  1537.  
  1538.     El següent tros de codi és el que correspon amb el bucle principal i que
  1539.   es repeteix fins a que es presiona una tecla. Primer es comproba si la va-
  1540.   riable 'clock' té un valor el suficientment gran com per a escriure un nou
  1541.   missatge en pantalla. Després fem un gran bucle on es modifiquen els valors
  1542.   i es fa un bonic efecte en pantalla (i molt millorable). Després es cópia
  1543.   a la VGA i ja es torna a repetir tot un altra vegada.
  1544.  
  1545.   Repeat
  1546.     If s>7 Then s:=1;
  1547.     If clock>15 Then
  1548.      BEGIN
  1549.        clock:=0;
  1550.        SetCursor(20, 10);
  1551.        Escribe(hfont, Msg[s], pv1, $FF, 18, 18);
  1552.        Inc(s);
  1553.      END;
  1554.     For i:=1 To 318 DO
  1555.      BEGIN
  1556.        For j:=1 To 99 DO
  1557.         BEGIN
  1558.           col:=(CogePixel(i  , j-1, pv1)+
  1559.                 CogePixel(i-1, j-1, pv1)+
  1560.                 CogePixel(i+1, j-1, pv1)+
  1561.                 CogePixel(i  , j  , pv1)+
  1562.                 CogePixel(i-1, j  , pv1)+
  1563.                 CogePixel(i+1, j  , pv1)) DIV 6;
  1564.           PonPixel(i, j, col, VGA);
  1565.         END;
  1566.      END;
  1567.     CopiaPantalla(VGA, pv1);
  1568.     Inc(Clock);
  1569.   Until KeyPressed;
  1570.   EndGRAPH;
  1571. END.
  1572.  
  1573.     Finalment "apaguem" GRAPH i surtim al DOS. Aquest exemple nomes vol ser
  1574.   per a ensenyar a programar amb GRAPH, mai s'ha volgut fer un exemple de
  1575.   cualitat ni res d'aixó.$$
  1576. %%215
  1577.        PROGRAMACION PRACTICA CON GRAPH
  1578.  
  1579.     A continuación se presenta un ejemplo completo de programación con GRAPH
  1580.   en cada uno de los lenguajes que soporta GRAPH.
  1581.  
  1582.        PROGRAMACION EN ASSEMBLER
  1583.  
  1584.     La programación en assembler, el lenguaje más potente de los existentes,
  1585.   es un poco más dificil. Pero la dificultad está compensada y grácias a este
  1586.   lenguaje conseguirás metas inimaginables en lo que respecta a velocidad y
  1587.   compactación. Al ser el lenguaje nativo de GRAPH, el acoplamiento es el más
  1588.   perfecto.
  1589.     Vamos a hacer un pequeño ejemplo de programación en assembler que consis-
  1590.   tirá en un scroll de texto sin usar el hardware (no muy recomendable cuando
  1591.   tengamos la posibilidad de ayudarnos del hardware). Lo primero serà elegir
  1592.   la forma y el tipo de llamadas que haremos a GRAPH. He elegido el modelo
  1593.   "near" y las macros porque se trata de un proyecto pequeño y en el que ne-
  1594.   cesitamos la velocidad máxima, respectivament.
  1595.     Primero tendremos que colocar todo eso de los segmentos de datos y código.
  1596.   Para simplificar escogeré los que nos da el TASM por defecto:
  1597.  
  1598. .MODEL SMALL
  1599. .STACK
  1600. .386
  1601.  
  1602. .DATA
  1603. PVirt1  DB      0
  1604. hFont   DB      0
  1605. Msg1    DB      'Esto es una prueba de scroll',0
  1606.  
  1607. .CODE
  1608.  
  1609.   He colocado unos datos en el segmento correspondiente que son respectiva-
  1610.   mente para un handle de PV (pantalla virtual), un handle de fuente y el
  1611.   mensaje del scroll.
  1612.     Seguidamente colocaremos la cabecera que nos permite llamar a GRAPH desde
  1613.   el assembler y el procedimento principal (y único):
  1614.  
  1615. INCLUDE GRFLIB.INC
  1616.  
  1617. Inicio          PROC
  1618.  
  1619.   Dentro de este procedimento colocaremos, primero, una llamada para liberar
  1620.   la memoria ocupada y la inicialización de GRAPH y los datos del programa:
  1621.  
  1622.                 CALL    LiberaMEM       ;  Se libera la memoria.
  1623.                 MOV     BX, 1
  1624.                 MOV     EAX, 010b
  1625.                 InicGRAPH               ;  Encendemos GRAPH.
  1626.                 MOV     AX, @DATA
  1627.                 MOV     DS, AX
  1628.  
  1629.     Una vez hecho esto ya podemos llamar a cualquier función de GRAPH, ya
  1630.   estan todas disponibles. Lo siguiente a hacer serà pedir una PV y iniciali-
  1631.   zar el sub-sistema de fuentes (pidiendo al DOS que nos deje prestadas sus
  1632.   fuentes):
  1633.  
  1634.                 CreaVirtual             ;  Pedimos una PV.
  1635.                 MOV     [PVirt1], AL
  1636.                 MOV     AL, 8
  1637.                 CambiaTipo              ;  Cambiamos el tipo de fuente.
  1638.                 CogeFuenteDOS           ;  Cogemos las fuentes del DOS.
  1639.                 MOV     [hFont], AL
  1640.  
  1641.     Una vez hecho esto nada más nos queda hacer el scroll propiamente dicho:
  1642.  
  1643.                 MOV     DX, 205
  1644.           @@Bucle:
  1645.                 PUSH    DX
  1646.                 MOV     BX, 40
  1647.                 SetCursor               ;  Colocamos el cursor.
  1648.                 MOV     AL, [PVirt1]
  1649.                 MOV     CL, 0
  1650.                 BorraPantalla
  1651.                 MOV     BH, DL
  1652.                 MOV     SI, Offset Msg1
  1653.                 MOV     BL, [PVirt1]
  1654.                 MOV     AL, [hFont]
  1655.                 MOV     CL, 9
  1656.                 MOV     DL, 10
  1657.                 Escribe                 ;  Escribimos
  1658.                 WaitVR
  1659.                 MOV     AL, [PVirt1]
  1660.                 MOV     AH, 0           ;  La VGA
  1661.                 CopiaPantalla           ;  Dibujamos en la VGA.
  1662.                 POP     DX
  1663.                 DEC     DX
  1664.                 JNZ   @@Bucle           ;  Volvemos a repetir hasta 0.
  1665.  
  1666.   Lo primero que se hace es colocar en DX el valos 205 que después se coloca
  1667.   en la pila. Este valor nos indicará la fila donde se encuentra el texto al
  1668.   que le estemos haciendo el scroll y nos servirá en la primera llamada a
  1669.   GRAPH para decir donde queremos que se coloque el cursor gráfico. Despues
  1670.   llamaremos a con el valor 0 que se supone que es negro, la PV que haviamos
  1671.   pedido para no dejar una estela a nuestro paso. Lo siguiente es escribir en
  1672.   pantalla el texto y esperar a un retrazado vertical. Con éste retrazado
  1673.   (¡Que mal suena!) evitamos el efecto desagradable que puede aparecer. Por
  1674.   último copiamos a la VGA y hacemos las oportunas comprobaciones para ver
  1675.   siya se ha acabado el scroll. Las líneas que siguen se encargan de finali-
  1676.   zar GRAPH y volver al DOS:
  1677.  
  1678.                 VaciaMEM
  1679.                 EndGRAPH
  1680.                 MOV     AX, 4C00h
  1681.                 INT     21h             ;  Salimos al DOS.
  1682. Inicio          ENDP
  1683.                 END     Inicio
  1684.  
  1685.     Como podrás ver, puede resultar muy sencillo programar con GRAPH y por si
  1686.   todavía quieres más ejemplos, mira el otro ejemplo de programación con GRAPH
  1687.   y recuerda que para compilar solo tienes que escribir:
  1688.  
  1689.     TASM  mydemo.asm
  1690.     TLINK mydemo.obj graph.lib
  1691.  
  1692.  
  1693.        PROGRAMACION EN LENGUAJE C
  1694.  
  1695.     El ejemplo de C te demostrará la potencia de los scrolls por baldosas. He
  1696.   elegido el modelo "far" así que tendrás que compilar el ejemplo en el modelo
  1697.   "large". En el ejemplo abriremos unos ficheros de bloques y mapas y los vi-
  1698.   sualizaremos moviendonos aleatoriamente por la pantalla hasta presionar una
  1699.   tecla. Primero se encuentran los ficheros de inclusión entre los que está
  1700.   el de GRAPH en C:
  1701.  
  1702. #include <stdlib.h>
  1703. #include <conio.h>
  1704. #include "GRFLIB.H"
  1705.  
  1706. int main(void)
  1707. {
  1708.  
  1709.     Seguimos inicializando las variables y el sistema GRAPH. Las variables que
  1710.   necesitamos son las de handles de PV, mapa y bloques y las que guardan las
  1711.   coordenadas de pantalla y los incrementos.
  1712.  
  1713.  byte hdlpv, hmap, hblk;
  1714.  int num, ix, iy;
  1715.  dword coorx,coory;
  1716.  
  1717.  InicGRAPH(1,0);
  1718.  TrataError();
  1719.  hdlpv=CreaVirtual();
  1720.  TrataError();
  1721.  hmap=CargaMapa("ejemplo.map");
  1722.  TrataError();
  1723.  hblk=CargaBloque("ejemplo.blk");
  1724.  TrataError();
  1725.  coorx=coory=0;
  1726.  
  1727.     Continuamos con un bucle "while" donde se comprueba si se ha presionado
  1728.   una tecla y se inicializan los incrementos:
  1729.  
  1730.  while(!kbhit())
  1731.   {
  1732.    num=random(100);
  1733.    ix=random(3)-1;
  1734.    iy=random(3)-1;
  1735.  
  1736.   Despues hay otro bucle "while" que nos servirá para incrementar las posi-
  1737.   ciones (comprobando que no nos pasamos demasiado) y dibujar en la PV que
  1738.   habiamos pedido el mapa de bloques. Y al final copiamos a la VGA el mapa
  1739.   que habiamos creado internamente.
  1740.  
  1741.    while(--num>0)
  1742.     {
  1743.      coorx+=ix;
  1744.      coory+=iy;
  1745.      if(coorx>10000) coorx=0;
  1746.      if(coory>10000) coory=0;
  1747.      DibujaMapa(hdlpv,hmap,hblk,coorx,coory);
  1748.      CopiaPantalla(hdlpv,0);
  1749.      }
  1750.    }
  1751.  
  1752.     Finalizamos GRAPH y volvemos al DOS con las siguientes línias:
  1753.  
  1754.  VaciaMEM();
  1755.  EndGRAPH();
  1756.  return 0;
  1757.  }
  1758.  
  1759.   Es muy sencillo programar en C con GRAPH. Si quieres ver más ejemplos en C
  1760.   tendrás que esperar a la próxima versión o hacerlos tu mismo (a programar en
  1761.   GRAPH solo se aprende programando ;-)
  1762.  
  1763.        PROGRAMACION EN PASCAL
  1764.  
  1765.     El ejemplo de Pascal nos mostrará una rutina que es el principio de muchos
  1766.   efectos de demos como el fuego fractal, el blur, etc. Tambien podremos ver
  1767.   con este ejemplo un truco para dividir las líneas en pantalla.
  1768.     Para empezar ampliaremos la memoria de pila hasta el máximo i indicaremos
  1769.   al Pascal que utilizaremos GRAPH mediante la TPU llamada "grflib.tpu":
  1770.  
  1771. {$M 64000,0,655360}
  1772. PROGRAM ProbaDeGRAPHiPascal;
  1773.  
  1774. USES Crt, grflib;
  1775.  
  1776.     Lo siguiente es la initicialización de las constantes y las variables. La
  1777.   constante "VGA" la usaremos despues para referirnos a la pantalla física.
  1778.   Las variables de memoria almacenarán los handles de paleta, fuente y PV.
  1779.   Además tenemos unas variables auxiliares y un array de mensajes y las
  1780.   variables que indicarán cuando mostrar un nuevo mensaje y el color de este:
  1781.  
  1782. CONST
  1783.    VGA  =  0;
  1784.  
  1785. VAR
  1786.   hfont,
  1787.   pv1      : Byte;
  1788.   i, j, s  : Integer;
  1789.   Msg      : Array [1..10] of String;
  1790.   Clock    : Integer;
  1791.   Col      : Byte;
  1792.  
  1793.     El siguiente bloque de código es la inicialización de GRAPH y el truco
  1794.   para dividir las líneas en pantalla:
  1795.  
  1796. BEGIN
  1797.   InicGRAPH(1,0);
  1798.   ASM
  1799.     MOV dx,3d4h
  1800.     MOV al,9
  1801.     OUT dx,al
  1802.     INC dx
  1803.     IN  al,dx
  1804.     AND al,0e0h
  1805.     ADD al,3
  1806.     OUT dx,al
  1807.   END;
  1808.  
  1809.     Despues aparecen la parte donde se pide la PV y se carga la paleta de
  1810.   colores. Observad que borramos la VGA y la PV que hemos pedido porque
  1811.   podrian contener datos que no deseamos que aparezcan. Observa tambien que
  1812.   cuando cargamos la paleta no guardamos el handle. Por tanto no podremos
  1813.   liberar la memoria usada por ésta hasta que no llamemos a `VaciaMEM∩ o sal-
  1814.   gamos del programa. Para finalizar éste bloque, recuerda que detrás de cada
  1815.   literal cuando programes en PASCAL tendrás que insertar un carácter 0.
  1816.  
  1817.   pv1:=CreaVirtual;
  1818.   BorraPantalla(0, pv1);
  1819.   BorraPantalla(0, VGA);
  1820.   CambiaTipo(8);
  1821.   hfont:=CogeFuenteDOS;
  1822.   PonPaleta(CargaPaleta('paleta.col'+chr(0)), 0, 0);
  1823.  
  1824.   Msg[1] := '    Hola a tots, açó és Pascal + GRAPH'+chr(0);
  1825.   Msg[2] := '   Hola a todos, esto es Pascal + GRAPH'+chr(0);
  1826.   Msg[3] := '  Hello everyone, this is Pascal + GRAPH'+chr(0);
  1827.   Msg[4] := '=========================================='+chr(0);
  1828.   Msg[5] := '------------------------------------------'+chr(0);
  1829.   Msg[6] := '__________________________________________'+chr(0);
  1830.   Msg[7] := '..........................................'+chr(0);
  1831.  
  1832.   s:=1; clock:=100;
  1833.  
  1834.     El siguiente trozo de código es el que corresponde con el bucle principal
  1835.   y que se repite hasta que se presiona una tecla. Primero se comprueba si la
  1836.   variable 'clock' tiene un valor suficientmente grande como para escribir un
  1837.   nuevo mensaje en pantalla. Despues hacemos un gran bucle donde se modifican
  1838.   los valores y se hace un bonito efecto en pantalla (y muy mejorable).
  1839.   Despues se cópia a la VGA y se vuelve a repetir todo otra vez.
  1840.  
  1841.   Repeat
  1842.     If s>7 Then s:=1;
  1843.     If clock>15 Then
  1844.      BEGIN
  1845.        clock:=0;
  1846.        SetCursor(20, 10);
  1847.        Escribe(hfont, Msg[s], pv1, $FF, 18, 18);
  1848.        Inc(s);
  1849.      END;
  1850.     For i:=1 To 318 DO
  1851.      BEGIN
  1852.        For j:=1 To 99 DO
  1853.         BEGIN
  1854.           col:=(CogePixel(i  , j-1, pv1)+
  1855.                 CogePixel(i-1, j-1, pv1)+
  1856.                 CogePixel(i+1, j-1, pv1)+
  1857.                 CogePixel(i  , j  , pv1)+
  1858.                 CogePixel(i-1, j  , pv1)+
  1859.                 CogePixel(i+1, j  , pv1)) DIV 6;
  1860.           PonPixel(i, j, col, VGA);
  1861.         END;
  1862.      END;
  1863.     CopiaPantalla(VGA, pv1);
  1864.     Inc(Clock);
  1865.   Until KeyPressed;
  1866.   EndGRAPH;
  1867. END.
  1868.  
  1869.     Finalmente "apagamos" GRAPH y salimos al DOS. Este ejemplo sólo quiere
  1870.   mostrar como programar con GRAPH, nunca se ha pretendido hacer un ejemplo
  1871.   de calidad ni nada parecido.$$
  1872. %%315
  1873.     I'm sorry :-( Information not available in english.
  1874.     Write me a post card to receive some help. Thank you :-)
  1875.     Read the examples in the directory DEMOS.$$
  1876.